2014-02-13 44 views
0

我正在嘗試從我的Java應用程序中讀取從C#應用程序發送的byte[]Java socket從C#讀取字節#

但是,當我在C#中編碼stringbyte[],並使用下面的代碼在Java中讀取它時,我得到的都是最後一個字符。這是爲什麼?

的Java代碼接收:

int data = streamFromClient.read(); 
while(data != -1){ 
    char theChar = (char) data; 
    data = streamFromClient.read(); 
    System.out.println("" + theChar); 
} 

C#代碼發送:

public void WriteMessage(string msg){ 

    byte[] msgBuffer = Encoding.Default.GetBytes(msg); 
    sck.Send(msgBuffer, 0, msgBuffer.Length, 0); 
} 
+2

我的猜測是你沒有發送最後一個字符。 –

+0

^是的大聲笑。 我們可以看到您的發送代碼嗎? – Mozzie

+0

我將C#代碼添加到帖子中 –

回答

2

雖然其他人已經提供了一個可能的解決方案,我想展示我將如何解決這個問題。

int data; 
while((data=streamFromClient.read()) != -1) { 
    char theChar = (char) data; 
    System.out.println("" + theChar); 
} 

我只是覺得這種方法會更清楚一點。隨意選擇你更喜歡的東西。

澄清:您的接收代碼存在錯誤。你讀了最後一個字節,但你從不處理它。在每次迭代中,您都會打印出前一次迭代中接收到的字節的值。所以當數據是-1時,最後一個字節會被處理,但是你不進入循環,因此它不會被打印。

+0

沒有必要將「數據」初始化爲-1。 – C4stor

+0

你是對的。編輯。 – user432

1

你需要讀取數據,直到除非是成爲-1。 因此,如果結果爲-1,您需要將infinite loop內的閱讀說明(即while(true))從其中移出一次。

試試這個:

int data = -1; 
while(true){ 
data=streamFromClient.read(); 
if(data==-1) 
{  
    break; 
} 
char theChar = (char) data;  
System.out.println("" + theChar); 
} 
+0

您在while循環中調用了read()兩次,我認爲這是無效的。你會錯過一半的人物。 – C4stor

+0

@ C4stor:這是錯誤的,我忘記從OP的帖子複製實際代碼後刪除,謝謝 –

-2

我以爲你while循環可能通過1次迭代不知何故已經關閉,但在我看來,你的C#程序根本就沒有發送的所有字符。

+0

我不知道爲什麼我收到了投票或接受的解決方案爲什麼被「接受」。是的,它每次都通過循環打印上一次迭代的值,但是當前一次迭代中的數據爲-1時,意味着不再需要處理。因此沒有理由再次通過循環。 – M7Jacks