C#服务器和Java客户端TCP

C#服务器和Java客户端TCP,java,c#,tcp,Java,C#,Tcp,问题是GetBufferSizemethod,我发送了一个40的缓冲区大小,它返回一些奇怪的数字54124。 为什么java int字节码与C#int字节码不同 JAVA客户端 mBufferOut=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),UTF8)),true); 私有void发送消息(最终字符串消息){ if(mBufferOut!=null&&message!=nu

问题是
GetBufferSize
method,我发送了一个40的缓冲区大小,它返回一些奇怪的数字54124。
为什么java int字节码与C#int字节码不同

JAVA客户端

mBufferOut=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),UTF8)),true);
私有void发送消息(最终字符串消息){
if(mBufferOut!=null&&message!=null){
试一试{
Log.d(“_标记”,“消息长度:”+Integer.toString(Message.length());
Log.d(“_标记”,“发送:”+消息);
mBufferOut.print(message.length());
mBufferOut.flush();
mBufferOut.打印(消息);
mBufferOut.flush();
}捕获(异常e1){
e1.printStackTrace();
}
}
}
上面的代码发送两条消息:第一条是缓冲区大小,第二条是数据本身

C#服务器

private void Read() {
    int size = GetBufferSize();

    byte[] myReadBuffer = new byte[size];
    int numberOfBytesRead = 0;
    string str = "";

    do
    {
        numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);

        str = Encoding.UTF8.GetString(myReadBuffer, 0, numberOfBytesRead);
    } while (networkStream.DataAvailable);
}

private int GetBufferSize()
{
    byte[] myReadBuffer = new byte[4];
    int numberOfBytesRead = 0;

    do
    {
        numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
    } while (networkStream.DataAvailable);

    if (numberOfBytesRead > 0)
    {
        return BitConverter.ToInt32(myReadBuffer, 0);
    }
    else
    {
        return 0;
    }
}

有什么想法吗?

很可能你对endianness有意见。Java以big-endian存储数据,.NET根据您的系统架构存储数据。如果您在x86机器上,很可能您正在尝试读取大端数据,就像它是小端数据一样。在读取字节数组之前,必须将其反转

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(buffer);
            }

解决方案

         `return   Int32.Parse(Encoding.UTF8.GetString(myReadBuffer, 0, myReadBuffer.Length))`;
问题

公共作废打印(整数单位)

将指定整数的字符串表示形式打印到 目标


整数转换为该整数的字符串表示形式,然后转换为字节。

实际上,Oracle JVM和Microsoft CLR都以相同的方式存储数据,这取决于系统。他们将数据写入流的方式可能不同。35缓冲区大小变为859111424,我添加了您的代码不起作用android设备是VM,Windows应用程序是x86@vandenchJVM中的数据存储取决于系统架构。但是,存储在JVM上运行的程序中的任何多字节数据项都是big-endian。我建议您将发送的字节和接收的字节视为单个字节。检查它们是否相同。计算它们如何表示您发送的人类可读值。找出它们是如何表示接收到的错误值的。当然正确的解决方案是以字节形式发送值?好的,但PrintWriter不允许发送字节,或者是这样,我检查过了,没有可用的方法。所有这些方法都采用其他数据类型我不熟悉Java,但是:我认为您的问题源于使用文本编码发送数据。我设想
getOutputStream()
返回的流能够写入字节。您正在使用
OutputStreamWriter
对其进行包装,根据文档,它是从字符流到字节流的桥梁。这取决于你到底想投入多少精力。你也可以只发送“length,message”,然后
GetBufferSize()
就可以一直读到它碰到逗号,然后从逗号前的字符串中解析出长度。我也不熟悉Java,我发现你可以用binaryformatter扭曲它,直接写入字节。