TCP连接 - 服务器仅在关闭套接字后发送消息

时间:2014-11-12 17:17:09

标签: java multithreading sockets tcp

我正在尝试让客户端向服务器发送请求并在保持连接的同时收到响应。

如果我关闭套接字:

//server side
outToClient.writeBytes("Message to send");
connectionSocket.close();

//client side
serverResponse = inFromServer.readLine(); 
System.out.println("FROM SERVER: " + serverResponse);

客户端输出

  

FROM SERVER:要发送的消息

之后,显然连接丢失了。

如果我没有关闭套接字:

//server side
outToClient.writeBytes("Message to send");

//client side
serverResponse = inFromServer.readLine(); 
System.out.println("FROM SERVER: " + serverResponse);

客户端没有输出。 服务器从不发送消息,或者客户端从未接收消息。

任何人都知道发生这种情况的可能原因? 客户端使用线程来接收消息,使用线程来发送消息。客户端套接字在主客户端线程中创建,因此接收者和发送者线程使用当前套接字进行通信。

提前致谢。

2 个答案:

答案 0 :(得分:8)

如果客户端希望读取一行,则服务器应写一行。一行以\n字符终止。

可能还需要刷新您用于将数据发送到客户端的流:

outToClient.writeBytes("Message to send\n");
outToClient.flush();

如果没有看到代码,很难说是否需要刷新。

答案 1 :(得分:3)

永远不要在没有先指定协议的情况下在TCP上编写任何代码。否则,当您遇到这样的问题时,无法确定哪一端有问题。

一方认为它正在发送“消息”。另一方不相信它收到的数据是“消息”。哪个是对的?好吧,如果我们有一个协议规范,我们会看一下它对“消息”的定义,然后看看。

但我们没有,所以我们不能说。这使得无法构建正确的修复。如果您将发送方更改为发送一条线路,则接收方仍然需要一条线路。或者不是吗?并且您更改接收器以处理非线路的消息,是修复它还是破坏它?

在这种情况下,双方都错了。最可能的意图是消息由以换行符终止的一行数据组成。发件人不发送换行符,收件人也不会坚持使用换行符(因为它在连接关闭时接受数据作为“消息”)。因此,除非设计意图确实是“消息”是一大块数据,不包括以行结尾或连接结束而终止的行结尾,否则双方都是错误的。

记录协议。这是必不可少的一步。