0
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,這是錯誤的。java中的套接字通信
在這兩種情況下,我不會改變任何東西,除了傳輸數據的大小。
請幫幫我,謝謝!我做了我能做的一切,但我仍然無法弄清楚。
非常感謝!!!你的方法真的有效! – city 2013-04-24 20:56:28