java中的socket通信 this.cin=newdataInputStream(this.csocket.getInputStream()); 公共类ReceiveMessage扩展线程{ 公开募捐{ while(stop==false) 试一试{ 如果(cin.available()>0) 接收消息(); }捕获(IOE异常){ e、 printStackTrace(); } } } //阻塞、取消阻塞、感兴趣、不感兴趣、有、位字段、请求、片段 公共消息(){ int-rv=0; 字节[]长度=新字节[4];//总长度 试一试{ rv=cin读数(长度,0,4); }捕获(IOE异常){ e、 printStackTrace(); } 如果(rv0){ 试试{ cin.read(此有效载荷,0,大小); }捕获(IOE异常){ e、 printStackTrace(); } } 字节mtype=类型[0]; 开关(mtype){ 大小写(字节)0: recenPayLoad((字节)0); 打破 案例1: recenPayLoad((字节)1); 打破 案例2: recenPayLoad((字节)2); 打破 案例3: recenPayLoad((字节)3); 打破 案例4: 接收(有效载荷); 打破 案例5: 接收比特字段(有效载荷); 打破 案例6: 接收请求(有效载荷); 打破 案例7: 接收件(有效载荷、尺寸); 打破 违约: System.out.println(“错误的消息类型!”); } }

java中的socket通信 this.cin=newdataInputStream(this.csocket.getInputStream()); 公共类ReceiveMessage扩展线程{ 公开募捐{ while(stop==false) 试一试{ 如果(cin.available()>0) 接收消息(); }捕获(IOE异常){ e、 printStackTrace(); } } } //阻塞、取消阻塞、感兴趣、不感兴趣、有、位字段、请求、片段 公共消息(){ int-rv=0; 字节[]长度=新字节[4];//总长度 试一试{ rv=cin读数(长度,0,4); }捕获(IOE异常){ e、 printStackTrace(); } 如果(rv0){ 试试{ cin.read(此有效载荷,0,大小); }捕获(IOE异常){ e、 printStackTrace(); } } 字节mtype=类型[0]; 开关(mtype){ 大小写(字节)0: recenPayLoad((字节)0); 打破 案例1: recenPayLoad((字节)1); 打破 案例2: recenPayLoad((字节)2); 打破 案例3: recenPayLoad((字节)3); 打破 案例4: 接收(有效载荷); 打破 案例5: 接收比特字段(有效载荷); 打破 案例6: 接收请求(有效载荷); 打破 案例7: 接收件(有效载荷、尺寸); 打破 违约: System.out.println(“错误的消息类型!”); } },java,sockets,Java,Sockets,上面的代码用于从套接字读取数据。我创建了一个线程从套接字读取数据,然后根据数据中包含的消息类型分析数据。 现在的问题是,如果我将100字节传输到套接字中,我就可以正确地执行所有操作;然而,如果我将1000字节传输到套接字中,有时读取的数据是错误的。例如,变量类型通常不能大于7。但现在读取的类型大于7,这是错误的 在这两种情况下,除了传输的数据的大小外,我不会更改任何内容 请帮帮我,谢谢!我已经做了我能做的一切,但我仍然无法理解 摆脱available()调用。如果没有数据,read()将被阻塞。

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

在这两种情况下,除了传输的数据的大小外,我不会更改任何内容

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

  • 摆脱
    available()
    调用。如果没有数据,read()将被阻塞。目前你只是在烧掉CPU

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

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