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!");
        }       

}

上面的代码用于从套接字读取数据。我创建了一个线程从套接字读取数据。然后根据数据中包含的消息类型分析数据。现在,问题是如果我将 100 个字节传输到套接字,我可以正确地做所有事情;但是,如果我将 1000 个字节传输到套接字中,有时,读出的数据是错误的。例如,变量类型通常不能大于 7。但是现在读出的类型大于7,这是错误的。

在这两种情况下,除了传输的数据大小之外,我什么都没有改变。

请帮助我,谢谢!我已经做了我能做的一切,但我仍然无法弄清楚。

4

1 回答 1

1
  1. 摆脱available()电话。如果没有数据, read() 将阻塞。目前你只是在烧CPU。

  2. 检查每次读取的结果。你不能假设它填满了缓冲区。或DataInputStream.readFully()改为使用。

于 2013-04-24T04:21:06.037 回答