Java客户端到C#服务器。没有收到负数

时间:2014-06-30 13:10:07

标签: java c# networking tcp byte

我有一个Java应用程序将坐标发送到Unity中的c#游戏。除负值外,我的数据都会检出。相反,我只得到63或250的东西。取决于编码。

这是我的Java客户端应用程序:

@Override
public void run() {

    //Keep in a loop as long as the running variable is true
    while(running)
    {
        //Try catch block to catch exceptions for the networking code
        try{
            data1[0]=currentPlayer; // These are integers
            .....
            data1[8]=sendPause;

            for(int i=0; i<=9;i++){
                buf1[i]=(byte)data1[i];     //Casting to byte array
                //System.out.println(buf1[i]);
            }
            //socket is created in "onCreate" earlier
            socket.setTcpNoDelay(true);
            out = socket.getOutputStream(); 
            dos = new DataOutputStream(out);

            dos.write(buf1, 0, buf1.length);
            dos.flush();
            synchronized(this){ this.wait(30); } //This is to minimize the frequency 


            }catch(Exception e)
            {
                Log.e("TCP", "Error",e);
            }
        }

    }

这是我在C#服务器中接收的方法。

private void HandleClient(TcpClient client){
    try{
        byte[] bytes = new byte[256];
        String data = null;

        while(true) 
        {
            data = null;
            NetworkStream stream = client.GetStream();
            int i;
            while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
            {   
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                byte[] msg = System.Text.Encoding.UTF8.GetBytes(data);

                /*sbyte[] sbytes = new sbyte[msg.Length];
                for (int j = 0; j < msg.Length; j++)
                    sbytes[j] = (sbyte)msg[j];
                Debug.Log(sbytes[2]+" "+sbytes[3]);*/
                packetID=msg[0];
                switch(packetID){
                case 1:
                    p1.joyLx = msg[1];
                    ....
                    p1.pause = msg[8];
                    p1.active=true;
                    break;
                ....
                case 4:
                    p4.joyLx = msg[1];
                    ....
                    p4.active=true;
                    break;         
                }
            }
            client.Close();
        }
    }
    catch(SocketException e)
    {
        Debug.Log("SocketException:"+e);
    }
}

我一直在研究整个有符号/无符号字节的考验,但我担心事先将它保存到字节数组中就会删除这些数据。

P.S。这是我第一次来这里,我不是一个程序员,所以我可能错过了一些明显的东西。很抱歉,如果我不习惯......

搞定了!感谢您的帮助,并指出我的怪异!

[...]byte[] bytes = new byte[256];
        sbyte[] sbytes;

        while(true) 
        {
            NetworkStream stream = client.GetStream();
            int i;
            while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
            {   
                sbytes = new sbyte[bytes.Length];
                for (int j = 0; j < bytes.Length; j++)
                    sbytes[j] = (sbyte)bytes[j];
                packetID=bytes[0]; [...]

1 个答案:

答案 0 :(得分:0)

我认为你的问题是你在C#代码中使用了一个字节数组。 java中的一个字节的范围是-128到127. C#中的一个字节的范围是0到255.尝试将接收到的字节数组复制到一个sbyte数组中:

 sbyte[] signedB = new sbyte[bytes.Length];
 Buffer.BlockCopy(bytes, 0, signedB, 0, bytes.Length);

在此之后检查signedB的值。