• 4954阅读
  • 18回复

tcpsocket 多线程发送图片保存不成功 [复制链接]

上一主题 下一主题
离线foxgod
 

只看楼主 倒序阅读 楼主  发表于: 2014-11-28
本人写了一个tcpsocket的多线程的程序,从server传输图片到客户端,为什么收到了数据,但是保存早本地不成功呢?第二个问题是,为什么在局域网里面传输速度很慢呢,传输一个300M的数据需要10几分钟呢?? tcpclient.rar (6 K) 下载次数:14 tcpserver.rar (6 K) 下载次数:20
离线渡世白玉

只看该作者 1楼 发表于: 2014-12-01
你的服务端线程用的错完了、、
继承QThread的类,只有run是在子线程执行的、、
QTcpsocket不支持跨线程访问的、、

离线foxgod

只看该作者 2楼 发表于: 2014-12-02
回 渡世白玉 的帖子
渡世白玉:你的服务端线程用的错完了、、
继承QThread的类,只有run是在子线程执行的、、
QTcpsocket不支持跨线程访问的、、
 (2014-12-01 12:32) 

你知道QT设子网络带宽是哪个函数吗?
离线foxgod

只看该作者 3楼 发表于: 2014-12-02
回 渡世白玉 的帖子
渡世白玉:你的服务端线程用的错完了、、
继承QThread的类,只有run是在子线程执行的、、
QTcpsocket不支持跨线程访问的、、
 (2014-12-01 12:32) 

TCPSOCKET 穿大文件如何快速穿呢,http很快,但是tcp如何做呢
离线渡世白玉

只看该作者 4楼 发表于: 2014-12-04
QT设子网络带宽?
对不起恕我愚昧、、不懂、、
如果是连接后数据就是文件里的、、
直接客户端读取一定的发送,服务端接受直接写入文件,完了、、
如果还有其他接受的判断,就需要你自己协商数据的内容怎么区分、、、
离线foxgod

只看该作者 5楼 发表于: 2014-12-05
原来我是等文件全部读取玩了,才发送,这样就很慢,后来是一边发,一边接受,这样就可以就发送完了,局域网每秒10几M。结贴
离线foxgod

只看该作者 6楼 发表于: 2014-12-05
回 渡世白玉 的帖子
渡世白玉:QT设子网络带宽?
对不起恕我愚昧、、不懂、、
如果是连接后数据就是文件里的、、
直接客户端读取一定的发送,服务端接受直接写入文件,完了、、
如果还有其他接受的判断,就需要你自己协商数据的内容怎么区分、、、 (2014-12-04 15:58) 

原来我是等文件全部读取玩了,才发送,这样就很慢,后来是一边发,一边接受,这样就可以就发送完了,局域网每秒10几M。
离线tadpole999

只看该作者 7楼 发表于: 2015-01-28
楼主,,你是怎么做的啊 ,,一边发 一边接受。。
离线tadpole999

只看该作者 8楼 发表于: 2015-01-28
回 渡世白玉 的帖子
渡世白玉:你的服务端线程用的错完了、、
继承QThread的类,只有run是在子线程执行的、、
QTcpsocket不支持跨线程访问的、、
 (2014-12-01 12:32) 

看见你很高兴。
离线foxgod

只看该作者 9楼 发表于: 2015-01-29
回 tadpole999 的帖子
tadpole999:楼主,,你是怎么做的啊 ,,一边发 一边接受。。 (2015-01-28 17:04) 

一边发,一边收
离线渡世白玉

只看该作者 10楼 发表于: 2015-02-02
回 tadpole999 的帖子
tadpole999:看见你很高兴。 (2015-01-28 17:06) 

谢谢啊、、
这边发送,那边接受、、
接收到,写入、、
短连接只是传输一个而文件,就是接收到数据就写入文件、、
如果有其他交互,就需要你制定下数据结构去区分包、、
离线tadpole999

只看该作者 11楼 发表于: 2015-02-04
回 渡世白玉 的帖子
渡世白玉:谢谢啊、、
这边发送,那边接受、、
接收到,写入、、
短连接只是传输一个而文件,就是接收到数据就写入文件、、
....... (2015-02-02 11:24) 

我的程序是需要接受多个下位机的数据。一般8台,,,偶尔做一起一致性测试的时候 需要同时连接100台。每个下位机的数据量是0.5g。开多线程连接  通讯  传数据。就是不晓得怎么弄啊 ,,多线程连接搞定了。开的thread 并且  movetothread()   连接type都看明白 了。就担心,是不是需要mutex。还不敢试。
离线渡世白玉

只看该作者 12楼 发表于: 2015-02-06
回 tadpole999 的帖子
tadpole999:我的程序是需要接受多个下位机的数据。一般8台,,,偶尔做一起一致性测试的时候 需要同时连接100台。每个下位机的数据量是0.5g。开多线程连接  通讯  传数据。就是不晓得怎么弄啊 ,,多线程连接搞定了。开的thread 并且  movetothread()  .. (2015-02-04 14:41) 

如果最多100台,QTcpserver可以使用的、、
如果在多一点,就有问题了、、
Qtcpserver的性能就跟不上了、、
https://github.com/dushibaiyu/QtTcpThreadServer
这个我提供的一个Qtcpserver多线程化的一个模式例子、、
按照这个上面写的,不需要加任何锁的、、因为锁都在底层添加了。你上层处理数据都已经分好线程处理了、、

单如果你连接数较大,Qtcpserver就支持不住了、、
https://github.com/dushibaiyu/QAsioSocket
这个我封装的asio的,其接口完全按照qt的socket的接口来的、、性能提升有几倍的、、
threadServer 这个例子,和QtTcpThreadServer模式是一样的、、
离线tadpole999

只看该作者 13楼 发表于: 2015-02-09
我现在用thread 可以实现简短消息的传送,但是 下位机上传的数据是有几百兆,这样的大数据我就不会传送了。能给个例子不?大数据的传送。谢谢。

内容来自[短消息]
离线渡世白玉

只看该作者 14楼 发表于: 2015-02-09
回 tadpole999 的帖子
tadpole999:我现在用thread 可以实现简短消息的传送,但是 下位机上传的数据是有几百兆,这样的大数据我就不会传送了。能给个例子不?大数据的传送。谢谢。
内容来自[短消息]  (2015-02-09 10:50) 

大数据和小数据一样、、就是需要自己处理下、、如果是只传这一个数据,那就简单,连接上,然后分段发送,接收就拼合在一起、、
离线渡世白玉

只看该作者 15楼 发表于: 2015-02-09
回 tadpole999 的帖子
tadpole999:我现在用thread 可以实现简短消息的传送,但是 下位机上传的数据是有几百兆,这样的大数据我就不会传送了。能给个例子不?大数据的传送。谢谢。
内容来自[短消息]  (2015-02-09 10:50) 

如果socket还要做其他的,那就自己封包,然后根据包信息拼接、、也是要分段发送的、、
离线tadpole999

只看该作者 16楼 发表于: 2015-02-11
第一次做程序,别人给了个通信协议,不会看。



消息源----操作码-----状态位----数据长度-----数据------校验码
MessageSource-----Opcode-----Status-----DataSize------Data------Checksum


我原来 都是自己在server和client上  试着玩的,看见有别人的协议约束就不会搞了。再说上一个版本的代码里面用了插件,看起来 好复杂。


内容来自[短消息]
离线tadpole999

只看该作者 17楼 发表于: 2015-02-11
通信协议



数据包格式


消息源----操作码-----状态位----数据长度-----数据------校验码
MessageSource-----Opcode-----Status-----DataSize------Data------Checksum

消息源---MessageSource    :    int            一个32位整形数
0PC,采集站以站号表示
操作码---Opcode            :    int
命令的标识ID
状态位---Status            :    int
暂定0UDP连接,1TCP连接
数据长度---DataSize        :    int
数据长度,最大长度512
数据----Data                :    double[]
                            数据内容,最大长度512,即1K  32位数
校验码Checksum        :    int        

命令列表


1、请求TCP服务:
        MessageSource    Opcode        Status    DataSize        Data            Checksum
            0            200            0        0            NULL        
2、发送TCP OK
        MessageSource    Opcode        Status    DataSize        Data            Checksum
发送站号        10100        0        0            NULL        
3、请求硬件检查
        MessageSource    Opcode        Status    DataSize        Data            Checksum
            0            10200        1        0            NULL        
4、请求工作状态
        MessageSource    Opcode        Status    DataSize        Data            Checksum
            0            10400        1        0            NULL        
5、发送硬件状态
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        10300        1        硬件数        硬件状态数组        
6、发送工作状态
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        100            1        1            工作状态位        
7、请求参数设置
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        0                10600        1        0            NULL        
8、发送参数态就绪
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        10500        1        0            NULL        
9、请求工作模式设置
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        0                20200        1        1            工作模式代码        
10、发送开始参数设置
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        20100        1        0            NULL        
11、接收参数设置
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        0                20400        1        参数对数    参数对值

        关于参数对值-------------参数名称代码:参数值------2个double
        
12、发送参数设置完毕
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        20300        1        0            NULL
13、接收请求采集
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        0                20600        1        0            NULL
14,发送采集态就绪
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        20700        1        0            NULL
15,接收采集开始
        MessageSource    Opcode        Status    DataSize        Data            Checksum
        0                30200        1        0            NULL
16、接收数据上传完毕
MessageSource    Opcode        Status    DataSize        Data            Checksum
        发送站号        30600        1        0            NULL


内容来自[短消息]
离线tadpole999

只看该作者 18楼 发表于: 2015-02-11
都不晓得 下位机会发什么样的东西上来。
这次还需要把下位机发来的数据 写进MySQL里面。

内容来自[短消息]
快速回复
限100 字节
 
上一个 下一个