Java通过Socket发送和接收多条消息

Java通过Socket发送和接收多条消息

问题描述:

我们需要实现一个Socket客户端,它应该连接到一个接受TCP连接的服务器。如果我通过netcap与服务器进行通信,我会立即得到它的响应(通过命令行)。Java通过Socket发送和接收多条消息

的工作流程是:

nc 99.0.99.84 20000 

然后我发送连接请求到服务器

*99*0## 

我得到的ACK响应返回

*#*1## 

我送我的要求

*#18*802*86## 

我得到的回应回

*#18*802*86*222241400##*#*1## 

一切都是通过命令行非常快。

所以我试图用这种方式

try { 

      Socket socket = new Socket("99.0.99.84", 20000); 

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      System.out.println("Start"); 
      Thread.sleep(1000); 
      String connectionRequest ="*99*0##"; 
      System.out.println("Sending connection request " + connectionRequest); 
      out.println(connectionRequest); 
      String connResponse = in.readLine(); 

      System.out.println("Response to connection is " + connResponse); 
      Thread.sleep(500); 
      String payload ="*#18*802*86##"; 
      System.out.println("Sending " + payload); 
      out.println(payload); 
      String response = in.readLine(); 


      System.out.println("Response is " + response); 
      out.close(); 
      in.close(); 
      socket.close(); 

     } catch (UnknownHostException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
    } 

使用摄像机时,客户端采用了大量的时间,然后与响应退出该连接响应= null与一个客户端的Socket做到这一点

Sending connection request*99*0## 
Response to connection is *#*1##*#*1## 
Sending *#18*802*86## 
Response is null 

有什么问题吗?

+0

响应以'\ r','\ n'还是'\ r \ n'结尾? readLine将读取直到该点,然后等待它。 – icabod

+0

没有...没有行尾元素... – besmart

+0

感谢您的评论我解决了使用读取()通过读取char每个字符 – besmart

正如你可以在这里看到:https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()

的readLine()将返回null如果到达行尾料如“\ n”或“\ r”前的数据流被终止。

就像你的情况一样,你不发送EOL然后关闭流,从而返回null。

尝试在msg的末尾添加'\ n'。

希望这有助于。

+0

谢谢,问题是我无法改变服务器如何发送它的消息。 – besmart

+1

在阅读之前尝试冲洗作者。 out.flush() –