gpt4 book ai didi

java - java中的socket通信

转载 作者:行者123 更新时间:2023-12-01 14:39:02 25 4
gpt4 key购买 nike

this.cin = new DataInputStream(this.csocket.getInputStream()); 

public class ReceiveMessage extends Thread{
public void run(){
while(stop == false)
try {
if(cin.available()>0)
receMessage();
} catch (IOException e) {
e.printStackTrace();
}
}
}

// choke, unchoke, interested, notinterested, have, bitfield, request, piece
public void receMessage(){
int rv=0;
byte[] length = new byte[4]; // total length
try {
rv = cin.read(length, 0, 4);
} catch (IOException e) {
e.printStackTrace();
}

if(rv <=0)
return;

byte[] type = new byte[1];
try {
cin.read(type, 0, 1);
} catch (IOException e) {
e.printStackTrace();
}

int size = byte2int(length) -4 -1; //size of payload
clearPayload();
if(size > 0){
try {
cin.read(this.payload, 0, size);
} catch (IOException e) {
e.printStackTrace();
}
}

byte mtype = type[0];
switch(mtype){
case (byte)0:
receNoPayload((byte)0);
break;
case 1:
receNoPayload((byte)1);
break;
case 2:
receNoPayload((byte)2);
break;
case 3:
receNoPayload((byte)3);
break;
case 4:
receHave(payload);
break;
case 5:
receBitField(payload);
break;
case 6:
receRequest(payload);
break;
case 7:
recePiece(payload, size);
break;
default:
System.out.println("wrong message type!");
}

}

上面的代码用于从socket读取数据。我创建一个线程从套接字读取数据,然后根据数据中包含的消息类型分析数据。现在的问题是,如果我将 100 个字节传输到套接字中,我可以正确执行所有操作;但是,如果我向套接字传输 1000 个字节,有时读出的数据是错误的。例如,变量类型通常不能大于7。但现在读出的类型大于7,这是错误的。

在这两种情况下,除了传输的数据大小之外,我不会更改任何内容。

请大家帮帮我,谢谢!我已经做了我能做的一切,但我还是想不通。

最佳答案

  1. 摆脱 available() 调用。如果没有数据,read() 将阻塞。目前你只是在烧毁CPU。

  2. 检查每次读取的结果。你不能假设它填满了缓冲区。或者使用 DataInputStream.readFully() 代替。

关于java - java中的socket通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16182609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com