[英]Cannot read from TCP socket
我有一个使用QT和JAVA服务器的C ++客户端,并且已成功从客户端写入服务器,但是无法从服务器写入客户端。 我的代码:
QString
Client::readTCP ( )
{
socketTCP->waitForReadyRead();
QTextStream in (socketTCP);
return in.readAll() ;
}
// Later on
qDebug() << Client::readTCP();
但是,无论我选择哪种方法,都无法从服务器获得响应。 服务器代码如下:
DataOutputStream output = new DataOutputStream (SOCKET.getOutputStream());
output.writeBytes ( "myString" );
回答:
之所以起作用,是因为我将in.readAll()
更改为in.readLine()
,还是因为我在服务器启动后等待了几秒钟才发送消息。
QTextStream::readAll
函数尝试读取流的全部内容。 此消息是否是流的全部内容。
如果此消息不是流的全部内容,则不应返回。 如果readAll
只指定了返回所有内容的事实,则readAll
仅返回流的一部分内容将是一个严重的错误。
如果这是流的全部内容,则服务器损坏。 如果它没有关闭套接字,客户端如何知道它已收到全部内容? 除非有其他指示消息结束的方法,否则必须通过关闭流来指示它,并且您不会显示服务器正在关闭流。
当我遇到这样的问题时,我将重复我始终给出的建议-永远不要实施网络协议,除非在协议规范中指定该协议。 否则,不可能解决服务器和客户端不同意的问题,因为无法知道哪一端是正确的。 在这里,服务器和客户端在如何标记消息的末尾上存在分歧,并且没有协议规范可供参考,因此无法知道要修复的末尾。
如果您有协议规范,则只需查看解释如何标记和检测消息结尾的部分即可。 然后,您可以修复不符合规范的任何一端。 (或者,如果规范没有说明如何,那么请修订该规范!显然,这必须以某种方式发生,而规范的工作就是解释如何做。)
在Java中,将数据发送到缓冲区后,刷新它。 输出流具有flush()方法,该方法强制将流中剩余的任何数据写入/发送。 如果在客户端使用readAll(),请尝试该操作。
另外,如果您知道将发送多少数据,则建议使用readLine()。 您可以循环通过in.readLine()直到其为空。 同样,readLine()将删除任何\\ n或\\ r \\ n。
我没有使用Qt的经验,所以我不能说您是否从套接字正确读取消息,但是使用Java时,我在发送文本时使用PrintStream
的方法println
,而VS C ++ Client可以使用recv
很好地接收它。
另外,您可能想检查数据包是否实际上是使用Wireshark通过套接字发送的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.