C#服务器和Java客户端TCP

时间:2018-09-22 01:08:27

标签: java c# tcp

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

JAVA CLIENT

mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), UTF8)), true);

private void sendMessage(final String message) {

    if (mBufferOut != null && message != null) {
        try {

            Log.d("_TAG", "Message length: " + Integer.toString(message.length()));

            Log.d("_TAG", "Sending: " + message);
            mBufferOut.print(message.length());
            mBufferOut.flush();
            mBufferOut.print(message);
            mBufferOut.flush();
        } catch (Exception 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;
        }
    }

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

解决方案

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

问题

  

公共无效打印(整数)

     

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

将Integer转换为该int的字符串表示形式,然后转换为字节。

答案 1 :(得分:0)

您可能在字节顺序方面遇到了问题。 Java将数据存储在big endian中,.NET根据您的系统体系结构存储数据。如果您使用的是x86机器,则可能正试图读取大端数据,就好像它是小端数据一样。您必须先反转字节数组,然后再读取它

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

Here's more info in endianness.