Java 维护一个持久的 TCP 连接

Posted

技术标签:

【中文标题】Java 维护一个持久的 TCP 连接【英文标题】:Java maintaining a persistent TCP connection 【发布时间】:2012-03-02 03:19:09 【问题描述】:

我正在尝试使用 TCP 从服务器向客户端发送多个数据。我只想为整个会话创建一个 TCP 连接。我该怎么做呢?

我尝试了以下流程的代码,但程序在收到第一个响应后停止。

客户端

1.create sockets and streams
2.send request for first data
3.wait for response from server
4.send next request <----------- server doesn't seem to handle this request
5.get next response from server

服务器端

1.Create server socket and wait for incoming connections
2.Parse incoming request
3.Send response
4.Parse next request
5.Send next response

当会话处于活动状态时,我不会关闭双方的套接字和流。

更新 这是我的代码sn-p: 客户

public void processRequest() throws Exception 

    Socket tempSocket = new Socket("0.0.0.0", 6782);

    String requestLine = "This is request message 1" + CRLF;

    DataOutputStream outToServer = new DataOutputStream(tempSocket.getOutputStream());            
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(tempSocket.getInputStream())); 

    outToServer.writeBytes(requestLine + CRLF);

    String serverResponse = inFromServer.readLine();
    System.out.println(serverResponse);

    requestLine = "This is request message 2" + CRLF;

    outToServer.writeBytes(requestLine + CRLF);

    serverResponse = inFromServer.readLine();
    System.out.println(serverResponse);

    outToServer.close();
    inFromServer.close();
    tempSocket.close();

服务器

public void processRequest() throws Exception 

    createConnections();

    String requestLine = inFromClient.readLine();
    System.out.println(requestLine);

    String responseLine = "This is the response to messsage 1";
    outToClient.writeBytes(responseLine + CRLF);

    requestLine = inFromClient.readLine();
    System.out.println(requestLine);

    responseLine = "This is the response to message 2";
    outToClient.writeBytes(responseLine + CRLF);

输出

客户:

This is the response to messsage 1
This is the response to message 2
BUILD SUCCESSFUL (total time: 1 second)

服务器:

This is request message 1

null
java.net.SocketException: Broken pipe

【问题讨论】:

贴出相关代码sn-ps -- 对不可见的代码很难提出建议。 :) 你写了两面,你肯定可以在服务器上附加一个调试器,看看第二个请求到达时会发生什么? 已发布必要的代码 sn-ps 和调试器输出 :) 【参考方案1】:

我认为问题出在您的客户端代码中。你写道:

    String requestLine = "This is request message 1" + CRLF;
    .....
    outToServer.writeBytes(requestLine + CRLF);

您将CRLF添加到requestLine,并在将其发送到服务器时再次添加。确保每条要发送的消息只添加一次 CRLF,它将按照您的意愿运行。

【讨论】:

非常感谢!这确实是我的代码的问题 -.- 我花了几个小时的调试才找到它!

以上是关于Java 维护一个持久的 TCP 连接的主要内容,如果未能解决你的问题,请参考以下文章

面试题:每发送一个http请求就要建立一个tcp连接吗(非持久连接/持久连接)

HTTP/2:如何提升网络速度?

与 TCPServer 保持另一个持久的 TCP 连接

WebSocket 是什么原理?为什么可以实现持久连接?

android端口号选择上的持久TCP连接?

移动网络方面的持久 TCP 连接?