Java TCPIP检测完整数据包消息

时间:2014-05-30 13:47:33

标签: java sockets ejb tcp-ip packets

我通过使用ServerSockets和Sockets在Java中使用TCPIP开发了一个应用程序。该应用程序是一个侦听器,用于侦听到达指定端口的消息。当消息到达时,它将被处理并完成各种事情。我的公司提供了一个小应用程序,它充当发送消息的客户端。最近,他们扩展了一次性发送多条消息的小应用程序。

现在,作为Listener的应用程序没有完全收到多条消息。我试图增加ServerSocket上的默认缓冲区,但仍然没有收到完整的消息。怎么调试呢?该公司有另一个应用程序的工作版本,可立即发送消息,并立即收到。 Listener应用程序一次接收一条消息。以下代码是一个示例:

@Startup
@Singleton
public class Listener {

       private ServerSocket serverSocket;
       private Socket socket;
       @Resource
       private ScheduledExecutorService executor;

       @PostConstruct
       public void init() {
              serverSocket = new ServerSocket(portNumber);
              Runnable runnable = new Runnable() {
                    public void run() {
                       try {
                         if(socket == null) {
                            socket = serverSocket.accept();
                            socket.setKeepAlive(true);
                         }
                         else if(socket.isClosed()) {
                             socket = serverSocket.accept();
                             socket.setKeepAlive(true);
                         }
                         char[] messages = buildMessage(socket.getInputStream());
                        }
                        catch(Exception e) {
                            System.out.println("Exception occurred");
                            e.printStackTrace();
                        }
                    }
              };
              executor.scheduleAtFixedRate(runnable, 0, 0, TimeUnit.SECONDS);
       }

     public char[] buildMessage(InputStream inputStream) throws Exception {
            StringBuilder message = null;
            char[] values = null;
            if(inputStream != null) {
                message = new StringBuilder();
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                int byteRead = bufferedInputStream.read();
                while(byteRead != -1) {
                     char value = (char) byteRead;
                     message.append(value);
                     // check how many bytes available
                     if(bufferedInputStream.available() != 0) {
                         byteRead = bufferedInputStream.read();
                     } 
                     else {
                        // to avoid blocking of data
                        break;
                     }
                }
             }
         }
     }

1 个答案:

答案 0 :(得分:0)

TCP中没有消息。

它是一个字节流,可以一次只接收一个字节的块接收。

如果您想要留言,您必须自己实施,直到您拥有所需的一切为止。

这可能需要更改或提供应用程序协议,如行,XML,长度字前缀等,以便您知道消息停止的位置。