簡體   English   中英

Java套接字通信問題

[英]Java socket communication problem

我正在使用Java進行套接字通信。 服務器正在從客戶端讀取字節,如下所示:

InputStream inputStream;
final int BUFFER_SIZE = 65536;
byte[] buffer = new byte[BUFFER_SIZE];
String msg="";

while (msg.indexOf(0)==-1 && (read = inputStream.read(buffer)) != -1)
{
    msg += new String(buffer, 0, read);
}
handleMessage(msg)

當客戶端在服務器混合消息時一次發送多個消息時,會出現問題

MSG1: <MyMessage><Hello/>nul
MSG2: </MyMessage><MyMessage><Hello again /></MyMessage>nul

因此,消息1的尾部是消息2的一部分。null表示java nul符號。

為什么輸入流會混合消息?

提前致謝!

您做錯了比較。 您檢查字符串中的任何地方是否有\\ 0,然后認為它是一條消息。 錯誤。 實際上,在第二個示例中,\\ 0出現兩次。

您應該以其他方式進行操作。 從char中以char形式從Stream中讀取(使用包裝的BufferedInputStream,否則性能將很糟糕),並在達到\\ 0時跳過。 現在消息已完成,您可以處理它。

InputStream bin = new BufferedInputStream(inputStream);
InputStreamReader reader = new InputStreamReader(bin);
StringBuilder msgBuilder = new StringBuilder();
char c;
while ( (c=reader.read()) != -1 ) 
{
    msgBuilder .append(c);
}
handleMessage(msgBuilder.toString())

最好使用換行符進行行分隔。 在這種情況下,您可以只使用BufferedReader的readline()功能。

套接字和InputStream只是字節流,而不是消息。 如果要基於\\0這樣的字符分解流,則需要自己執行此操作。

但是,在您的情況下,您似乎在發送方遇到了一個錯誤,因為\\0位置不正確,並且在客戶端很容易成為錯誤。

順便說一句:使用字符串+ =效率很低。

InputStream讀取的數據將隨操作系統一起提供,並且無法保證如何拆分。 如果您希望分拆新行,則可能需要考慮以下內容:

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

然后使用reader.readLine()將每一行作為String ,這就是您的消息。

我認為您的問題出在您的方法中:

客戶端一次發送多個消息時出現問題

套接字通常只獲取大塊字節,竅門在於如何發送它們,如何標記消息的開始/結束以及如何檢查錯誤(快速哈希可以做很多事情),因此該行為是在我看來,如果確實需要一次發送多封郵件,則只需要處理郵件即可。

套接字將控制您的消息是否是完整的物理方法,但是消息中所涉及的是您的關注。

暫無
暫無

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

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