[英]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.