• 5713阅读
  • 7回复

[提问]Qt C/S问题 [复制链接]

上一主题 下一主题
离线omonkey
 
只看楼主 倒序阅读 楼主  发表于: 2012-07-01
Client_QDataStream.tar.gz (5 K) 下载次数:9 Client
Server_QDataStream.tar.gz (4 K) 下载次数:7 Server
代码如上,功能是客户端可以获取服务器桌面的截图。


实现方式:Server先截图,再将图片分成几块二进制数据,然后分块发送,每次客户端接受后都返回一条信息表示成功接收,当数据发送完毕后服务器  发送空二进制数据给客户端,表示结束,然后客户端把图片显示出来。


经测试,客户端没问题
问题如下:
文件:thread.cpp



问题一:36行的send的数据发不出去,导致客户端一直处于等待,除非调用37行的函数或者关闭服务器,否则数据发不出去,以下代码已证实send已执行,因为已经成功调用了startTimer函数。


问题二:如果让下图thread在栈初始化而不是在堆初始化,问题一中36行的send就可一正常发送数据,这是为什么呢?


PS:send封装了(write函数和waitForBytesWritten函数),暂时将服务器改成单线程,因为多线程会有一些很奇怪的错误


文件:server.cpp




没有什么更好的方式实现这个服务器呢?比如说服务器与客户端以什么方式通信比较好呢?
离线2nth0nyj
只看该作者 1楼 发表于: 2012-07-02
36行的socket.send(QByteArray())是没有发任何东西的, 感觉就是没有发出去。 加了37行服务器端断开了链接, 客户端也就知道了链接断开,所以图片显示出来了。
至于线程在stack上初始化, 也是因为线程执行完毕销毁了, 从而断开了链接。 如果栈上初始化线程, 是会出现很奇怪的错误,有可能主线程继续执行, 创建的线程根本就没有机会执行。
离线omonkey
只看该作者 2楼 发表于: 2012-07-02
回 1楼(2nth0nyj) 的帖子
哦,懂了,谢谢。虽然说是连接没有断开所以信息发不出去,那有没有什么解决方法呢?不断开连接也能将最后那条数据发送出去呢?
离线2nth0nyj
只看该作者 3楼 发表于: 2012-07-02
回 2楼(omonkey) 的帖子
弄个表示结束的标志, 就行了吧??
离线omonkey
只看该作者 4楼 发表于: 2012-07-02
回 3楼(2nth0nyj) 的帖子
其实这个我之前就试过了,但是它就最后一条数据发不出去,也就是含结束标志的数据,要切断服务器与客户端连接才发送出去
离线2nth0nyj
只看该作者 5楼 发表于: 2012-07-02
回 4楼(omonkey) 的帖子
试试不用缓冲的呢, OpenMode设置Unbuffered, 这个问题还有点奇怪呢?
离线omonkey
只看该作者 6楼 发表于: 2012-07-02
回 5楼(2nth0nyj) 的帖子
用Unbuffered的话它
抛QIODevice::read: WriteOnly device异常
然后我就改成ReadWrite|Unbuffered,结果跟没加Unbuffered一样。虽然问题不能解决,不过还是谢谢你啦
离线且行且学

只看该作者 7楼 发表于: 2013-04-27
怎么没回应了,最终问题解决了吗?
快速回复
限100 字节
 
上一个 下一个