java中的socket通信

时间:2013-04-24 02:57:53

标签: java sockets

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,这是错误的。

在这两种情况下,除了传输数据的大小外,我不做任何改变。

请帮助我,谢谢!我做了我能做的一切,但我仍然无法理解。

1 个答案:

答案 0 :(得分:1)

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

  2. 检查每次阅读的结果。你不能认为它填充了缓冲区。或者改为使用DataInputStream.readFully()