2013-04-24 103 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