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,这是错误的。
在这两种情况下,除了传输数据的大小外,我不做任何改变。
请帮助我,谢谢!我做了我能做的一切,但我仍然无法理解。答案 0 :(得分:1)
摆脱available()
电话。如果没有数据,read()将阻塞。目前你只是在烧CPU。
检查每次阅读的结果。你不能认为它填充了缓冲区。或者改为使用DataInputStream.readFully()
。