簡體   English   中英

Java TCPIP檢測完整數據包消息

[英]Java TCPIP Detecting Full Packet Message

我已經通過使用ServerSockets和Sockets在Java中使用TCPIP開發了一個應用程序。 該應用程序是一個偵聽器,用於偵聽到達指定端口的消息。 消息到達時,將對其進行處理並完成各種操作。 我公司提供了一個小型應用程序,可以充當發送消息的客戶端。 最近,他們擴展了小型應用程序,該應用程序可以一次性發送多個消息。

現在,作為監聽器的我的應用程序無法完全接收多條消息。 我試圖增加ServerSocket上的默認緩沖區,但仍然沒有收到完整的消息。 如何調試? 該公司擁有另一個應用程序的工作版本,該應用程序可以立即發送消息,並且它們都會立即收到。 偵聽器應用程序一次性接收一條消息。 下面的代碼是一個示例:

@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;
                     }
                }
             }
         }
     }

TCP中沒有消息。

它是一個字節流,可以一次接收與一個字節一樣小的塊。

如果您想要消息,則必須自己閱讀,直到您擁有所需的一切為止,自己實現它們。

這可能需要更改或提供應用程序協議,例如行,XML,長字前綴等,因此您知道消息在哪里停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM