【问题标题】:reading multiple lines from TCP stream从 TCP 流中读取多行
【发布时间】:2016-04-01 03:47:33
【问题描述】:

希望构建一个 tcp 侦听器,该侦听器将从连接中读取信息并以一些数据进行响应。

我的程序在单行输入上运行,但是当我发送多行时它不起作用。

这是我使用的代码

try {
    Socket clientConnection = null;
    clientConnection = serverSocket.accept();
    clientConnection.setSoTimeout(5 * 1000);
    String tmpLine=null;
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    for (tmpLine = inFromClient.readLine(); tmpLine != null; tmpLine = inFromClient.readLine()) {
        searchLine += tmpLine;
        logMsg = "DBUG : T" + threadName + " readline : " + searchLine;
        stubLog.addMessage(logMsg, coreProperties.getLogger(),"DEBUG");
    }
} catch (Exception e) {
    logMsg = "ERRR : T" + threadName + " : tcpStubWorker: error in getting data : " + e.getMessage();
    stubLog.addMessage(logMsg, coreProperties.getLogger(),"ERROR");
    e.printStackTrace(); 
}

当我从安全带发送此消息时:

String logonMsg = "msg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021\n"
+ "bit 007: 1012165507  \n"
+ "bit 011: 498432  \n"
+ "bit 033: (11)59501100554  \n"
+ "bit 070: 001  \n"
+ "bit 100: (11)59503646554  \n";

我在日志中得到了这个:

DEBUG com.stubby.tcp.tcpStub  - 14:33:43:494 - DBUG : T00000026 readline : nullmsg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021
DEBUG com.stubby.tcp.tcpStub  - 14:33:43:509 - DBUG : T00000026 readline : nullmsg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021bit 007: 1012165507  
DEBUG com.stubby.tcp.tcpStub  - 14:33:43:510 - DBUG : T00000026 readline : nullmsg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021bit 007: 1012165507  bit 011: 498432  
DEBUG com.stubby.tcp.tcpStub  - 14:33:43:534 - DBUG : T00000026 readline : nullmsg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021bit 007: 1012165507  bit 011: 498432  bit 033: (11)59501100554  
DEBUG com.stubby.tcp.tcpStub  - 14:33:43:552 - DBUG : T00000026 readline : nullmsg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021bit 007: 1012165507  bit 011: 498432  bit 033: (11)59501100554  bit 070: 001  
DEBUG com.stubby.tcp.tcpStub  - 14:33:43:603 - DBUG : T00000026 readline : nullmsg: 0800    P3A^SNAT2 >>> S3A^SNAT204        15/10/12 16:55:07.00 rec: 001021bit 007: 1012165507  bit 011: 498432  bit 033: (11)59501100554  bit 070: 001  bit 100: (11)59503646554   
ERROR com.stubby.tcp.tcpStub  - 14:33:48:627 - ERRR : T00000026 : tcpStubWorker: error in getting data : Read timed out

知道为什么 for 循环无法识别 tmpLine != null 吗?

我想我可以减少超时并将该错误作为警告,但这听起来不太正确!

谢谢。

感谢反馈,对端正在使用此代码发送数据

Socket clientSocket = new Socket("10.52.88.102", 8888);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(logonMsg + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("From server: \"" + modifiedSentence +"\"");
clientSocket.close();

但仍然出现错误:(所以我怀疑我没有正确关闭连接??

【问题讨论】:

  • 您不需要初始化在下一行分配的变量。

标签: java tcp


【解决方案1】:

peer 没有关闭连接,你的读取循环只会在他关闭时停止。

【讨论】:

  • 正如我所说。在服务器响应之前,对等方无法关闭套接字,而在对等方关闭套接字之前,服务器也无法响应,因为它卡在其读取循环中。你需要在你的阅读循环中做出回应。
  • 或者发送请求后关闭客户端socket输出。
  • 谢谢大家,现在明白了。我试图编写一个“通用”存根,它需要处理整个消息,但我对 TCP 行为的理解显然缺乏。当客户应用程序加入时,我将需要适应它们的需求。希望这都是单行消息:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多