繁体   English   中英

无法从TCP套接字读取

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM