Java客户端到c#服务器.没有接收到负数

本文关键字:客户端 服务器 Java | 更新日期: 2023-09-27 18:10:44

我有一个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);
    }
}

我一直在研究整个有符号/无符号字节的考验,但我担心在将其保存到字节数组之前会擦除此数据。

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

让它工作!谢谢你的帮助,并指出我的奇怪之处!

[...]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]; [...]

Java客户端到c#服务器.没有接收到负数

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

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

检查signnedb的值