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 に答える