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!");
}
}
上記のコードは、ソケットからデータを読み取るために使用されます。ソケットからデータを読み取るスレッドを作成し、データに含まれるメッセージのタイプに従ってデータを分析します。さて、問題は、100 バイトをソケットに転送すると、すべてを正しく実行できることです。ただし、1000 バイトをソケットに転送すると、データの読み取りが間違っている場合があります。たとえば、通常、変数の型は 7 を超えることはできません。しかし、読み出された型が 7 より大きくなり、これは誤りです。
どちらの場合も、転送されるデータのサイズを除いて、何も変更しません。
私を助けてください、ありがとう!できることはすべてやりましたが、まだわかりません。