无法从TCP套接字读取

用户名

我有一个使用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()要么是因为我在服务器启动后等待了几秒钟,然后才发送消息。

大卫·施瓦兹(David Schwartz)

QTextStream::readAll函数尝试读取全部内容。该消息是流的全部内容还是不是流的全部内容。

如果此消息不是流的全部内容,则不应返回。readAll尽管仅指定返回流的所有内容,但如果仅返回流的部分内容,则将是一个严重的错误

如果这是流的全部内容,则服务器已损坏。如果它没有关闭套接字,那么客户如何知道它已收到全部内容?除非有其他指示消息结束的方法,否则必须通过关闭流来指示它,并且您不会显示服务器正在关闭流。

当我遇到这样的问题时,我将重复我总是给出的建议-永远不要实施网络协议,除非您在协议规范中指定该协议。否则,不可能解决服务器和客户端不同意的问题,因为无法知道哪一端是正确的。在这里,服务器和客户端在如何标记消息的末尾上存在分歧,并且没有协议规范可供参考,因此无法知道要修复的末尾。

如果您有协议规范,则只需查看解释如何标记和检测消息结尾的部分即可。然后,您可以修复不符合规范的任何一端。(或者,如果规范没有说明如何,那么请修订规范!显然,这必须以某种方式发生,并且规范的工作是解释如何做。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章