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]; [...]
我认为你的问题是你在c#代码中使用字节数组。java中一个字节的取值范围是-128到127。c#中的字节范围是0到255。尝试将接收到的字节数组复制到一个字节数组中:
sbyte[] signedB = new sbyte[bytes.Length];
Buffer.BlockCopy(bytes, 0, signedB, 0, bytes.Length);
检查signnedb的值