我有一个使用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()
,或者是因为我在服务器启动之后等了几秒才发送消息。
答案 0 :(得分:0)
QTextStream::readAll
函数尝试读取流的整个内容。此消息是否是流的全部内容。
如果此消息不是流的全部内容,则不应返回。如果readAll
仅返回流的一部分内容,尽管它被指定返回 all 内容,这将是一个严重的错误。
如果这是流的全部内容,则服务器已损坏。如果它没有关闭套接字,客户端怎么知道它收到了整个内容?除非有其他方式指示消息结束,否则必须通过关闭流来指示,并且不显示关闭流的服务器。
当我看到这样的问题时,我会重复我总是给出的建议 - 除非在协议规范中指定该协议,否则不要实现网络协议。否则,无法解决服务器和客户端不同意的问题,因为无法知道哪一端是正确的。在这里,服务器和客户端不同意如何标记消息的结尾,如果没有要引用的协议规范,则无法知道要修复哪一端。
如果您有协议规范,您可以查看解释如何标记和检测消息末尾的部分。然后你可以修复任何不符合规范的结束。 (或者,如果规范没有说明如何,那么修改规范!显然,这必须以某种方式发生,这是规范的工作来解释如何。)
答案 1 :(得分:0)
在Java中,将数据发送到缓冲区后,将其刷新。输出流具有flush()方法,该方法强制写入/发送流中剩余的任何数据。如果在客户端使用readAll(),请尝试使用它。
此外,如果您知道将发送多少数据,建议使用readLine()。你可以通过in.readLine()循环直到它变为null。 readLine()也将删除任何\ n或\ r \ n。
答案 2 :(得分:-1)
我没有使用Qt的经验所以我不能说你是否正在从套接字读取,但是使用Java我在发送文本时使用PrintStream
的方法println
,并且VS C ++客户端收到只需使用recv
即可。
此外,您可能想要使用Wireshark检查数据包是否实际通过套接字发送。