我想下面的發送字符串作爲字節數組從C#與Java:通過插座
C#客戶:
string stringToSend = "Hello man";
BinaryWriter writer = new BinaryWriter(mClientSocket.GetStream(),Encoding.UTF8);
//write number of bytes:
byte[] headerBytes = BitConverter.GetBytes(stringToSend.Length);
mClientSocket.GetStream().Write(headerBytes, 0, headerBytes.Length);
//write text:
byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(stringToSend);
writer.Write(textBytes, 0, textBytes.Length);
Java服務器:
Charset utf8 = Charset.forName("UTF-8");
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), utf8));
while (true) {
//we read header first
int headerSize = in.read();
int bytesRead = 0;
char[] input = new char[headerSize];
while (bytesRead < headerSize)
{
bytesRead += in.read(input, bytesRead, headerSize - bytesRead);
}
String resString = new String(input);
System.out.println(resString);
if (resString.equals("!$$$")) {
break;
}
}
字符串大小等於9.這兩個方面都是正確的。但是,當我在Java端讀取字符串iteself時,數據看起來不正確。炭緩衝液( '輸入' 可變)的含量如下:
」, 「」, 'H', 'E', '升', '升', 'O', ''
我試圖通過反轉字節數組來改變字節順序。還試着改變ASCII和UTF-8之間的字符串編碼格式。我仍然覺得它涉及到字節順序問題,但不知道如何解決它。我知道我可以使用其他類型的作家爲了寫入文本數據的蒸汽,但我正在嘗試使用原始字節數組爲了學習。
不可能診斷沒有好的[MCVE]認爲可靠重現問題。但是,看起來在代碼的Java方面,你根本沒有正確讀取字符串長度。 'in.Read()'方法將讀取單個字符,但您需要讀取從C#端發送的整數的四個字節。您不僅應該直接讀取字節(不要將它們解釋爲UTF8字符),您需要讀取正確的數量,然後將其解碼爲32位整數。 –
另外:字節順序不影響ASCII或UTF8。它可能會影響32位整數的傳輸,但你說這很好。所以,endianness似乎不是你的問題。您直接使用'NetworkStream'混合'BinaryWriter',這似乎毫無意義且容易出錯。但我也不認爲這是你的問題。如果修復在Java端讀取的整數不能解決您的問題,請修復問題以便它可以回答。 –
您正在將頭文件長度發送爲來自c#的4字節整數,但只讀取javaside上的單個字節以獲取該值。流中接下來的三個字節是0,0,0,這是java在您輸入時將轉換爲空字符。請參閱下面的答案。 –