我想下面的发送字符串作为字节数组从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在您输入时将转换为空字符。请参阅下面的答案。 –