首页 > 其他 > 详细

BIO的阻塞

时间:2020-04-10 19:12:17      阅读:92      评论:0      收藏:0      [点我收藏+]

java的网络编程大概可以分为BIO,NIO,AIO三种

第一种BIO是传统的io流为基础的,他是一种阻塞式的。

这是客户端

public class Client {
    public static void main(String[] args) {
        Scanner se=new Scanner(System.in);
        System.out.println("请输入客户端编号:");
        int code=se.nextInt();
        System.out.println("客户端编号是:"+code);
        Socket socket=null;

        try
        {
            System.out.println("客户端"+code+"开始连接服务器...");
            socket=new Socket("127.0.0.1",8888);
            if(socket!=null){
                System.out.println("客户端"+code+"连接服务器成功!");
            }
            OutputStream out= socket.getOutputStream();
            while (true){

                System.out.println("客户端"+code+"请输入要发送的内容:");
               String str=se.next();
               if(str.trim().equalsIgnoreCase("quit"))
                   break;
               out.write((code+"--->"+str).getBytes("utf-8"));
            }
            out.close();
            socket.close();


        }catch (Exception ex){
            ex.printStackTrace();
        }

    }

  这是服务端

public class Server {
    private static  int port=8888;
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket=null;
                try{
                    serverSocket=new ServerSocket(port);
                    System.out.println("服务端开始监听:"+port);
                    while (true){
                     var clientSocket= serverSocket.accept();//第一处阻塞
                        System.out.println("接受一个客户端请求");
                        InputStream in=clientSocket.getInputStream();
                        int hasread=0;
                        byte[] bufer=new byte[1024];
                        while ((hasread=in.read(bufer))!=-1){//第二处阻塞
                            System.out.println("客户端输入字符:"+new String(bufer,0,hasread));
                        }
                        clientSocket.close();
                        in.close();
                    }

                }
                catch (Exception ex){
                    ex.printStackTrace();
                }finally {
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
    }

  服务端在监听客户端,和接收客户端时,是阻塞的状态。

单独把服务端运行

技术分享图片

 

 程序阻塞在监听方法处

起一个客户端

技术分享图片

 

 显示连接服务器成功

技术分享图片

 

 此时服务器阻塞在读取客户端输入的文字处

技术分享图片技术分享图片

 

 此时通信成功,然而程序时在不停的循环等待中。

此时在起一个客户端,并发送内容

技术分享图片技术分享图片

 

 

 服务器是收不到内容的,因为他阻塞等待客户端1发送内容,此时把客户端1关停。

 

 技术分享图片技术分享图片

 

 服务端收到了客户端2的信息。

所以说,这个BIO是阻塞式的,要想实现多个客户端同时发送信息。需要多个线程。

 

BIO的阻塞

原文:https://www.cnblogs.com/tomato190/p/12675202.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!