无法从TCP套接字读取

时间:2015-02-15 20:51:08

标签: java c++ qt sockets 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(),或者是因为我在服务器启动之后等了几秒才发送消息。

3 个答案:

答案 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检查数据包是否实际通过套接字发送。