java中Socket使用io流的一些问题验证

1、发送端发送过来的数据,我就算当前只读了一部分,但是只要还是在循环体while(true)内循环读,就能继续把剩下的部分读出来,读完后就会阻塞,因此需要双方制定什么时候结束。
2、和发送端的通道建立后,在发送端不发送数据时,接收端会阻塞在read处,如果为文件时,读完了就返回-1,但是我们是开启的通道连接,不知道对面什么时候结束,所以会一直阻塞,当有数据进来就会继续往下执行,但是不会出while循环圈,除非break,还有就是设置socket.setSoTimeout,让它定时,超过这么长的时间没接收到数据就断开连接。
3、通信时不能在while里面写几个read,因为read会阻塞,所以如果想要几个read(既想做接收端也想做发送端),就需开线程处理。
4、当发送方一次发送大量数据时,通道中的数据可能不均匀,例如:发送方一次发送40万个字节,我一次只接收10万个,想的是四次接收完,但实际中可能不行,因为读数据时,可能一次没有读到10万个,因此就需拼接每次读取的数据,当长度为40万个时,退出循环,执行数据处理。
5、当和对方断开连接时,read返回的值都是-1或者null,看使用的是什么流,可以在程序中加入这一判断来结束连接。而不用使用setSoTimeOut设定多久没读到数据就断开。

发送端发一行东西过去,接收端收到了就回复收到

发送端

        Socket socket=null;
        OutputStream outputStream=null;
        InputStream inputStream=null;
        Scanner scanner=new Scanner(System.in);
        String msg;
        try {
    
    
            //接收端服务器的端口号和ip
            socket=new Socket("10.16.48.209",10086);
            //输出流
            outputStream = socket.getOutputStream();
            //输入流
            inputStream= socket.getInputStream();
            int len;
            byte[] bytes=new byte[100];
            //设置超时时间
//            socket.setSoTimeout(10000);
            while (true){
    
    
                //控制台输入数据
                msg=scanner.nextLine();
                outputStream.write(msg.getBytes());
                outputStream.flush();
                len= inputStream.read(bytes);
                if (len != -1) {
    
    //将接收到的数据打印在控制台
                    System.out.println(new String(bytes));
                }
                //将接收字节清0,以防下一次数据比上次短时出错
                Arrays.fill(bytes,(byte)0);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            IoUtils.closeIo(null,socket,inputStream,outputStream);
        }

接收端

public static void main(String[] args) {
    
    
        ServerSocket server=null;
        Socket socket=null;
        InputStream inputStream=null;
        OutputStream outputStream=null;
        byte[] bytes=new byte[100];
        int len;
        try {
    
    
            //设定接收端需绑定的端口号
            server=new ServerSocket(10086);
            //阻塞等待客户端连接
            socket = server.accept();
            //输出流
            outputStream= socket.getOutputStream();
            //输入流
            inputStream=socket.getInputStream();
            while (true) {
    
    
                //读取发送端发送的数据
                len=inputStream.read(bytes);
                //接收到数据时
                if (len!=-1) {
    
    
                    print(bytes,len);
                    outputStream.write("收到".getBytes());
                    outputStream.flush();
                }
                //将接收字节清0,以防下一次数据比上次短时出错
                Arrays.fill(bytes, (byte) 0);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            IoUtils.closeIo(server,socket,inputStream,outputStream);
        }
    }
    public static void print(byte[] bytes,int len){
    
    
        System.out.println("->"+new String(bytes,0,len));
    }

猜你喜欢

转载自blog.csdn.net/wflsyf/article/details/117284752
今日推荐