2013-04-24 147 views
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中的套接字通信

在這兩種情況下,我不會改變任何東西,除了傳輸數據的大小。

請幫幫我,謝謝!我做了我能做的一切,但我仍然無法弄清楚。

回答

1
  1. 擺脫available()電話。如果沒有數據,read()將會被阻塞。目前你只是在燒CPU。

  2. 檢查每個閱讀的結果。你不能假設它填滿了緩衝區。或者使用DataInputStream.readFully()

+0

非常感謝!!!你的方法真的有效! – city 2013-04-24 20:56:28