首页 > 编程学习 > Netty(三)、BIO工作机制和实例

Netty(三)、BIO工作机制和实例

发布时间:2022/1/17 12:25:48

目录

BIO工作原理图:

 BIO编程简单流程:

 BIO实例:

测试:


BIO工作原理图:

 BIO编程简单流程:

  1. 服务器端启动一个ServerSocket。
  2. 客户端启动Socket对服务器进行通信,默认情况下服务器端会为每一个客户端建立一个线程与之通信。
  3. 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待【阻塞】,或者被拒绝。
  4. 如果有响应,客户端会等待请求结束后【阻塞】,再继续执行。

 BIO实例:

package com.ujs.io.bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 同步并阻塞
 * 一个连接对应服务器上的一个线程
 */
public class BIOTest {
    public static void main(String[] args) {
        // 1 创建一个线程池
        // 2 如果有客户端连接,就创建一个线程与之通信
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        try {
            ServerSocket serverSocket = new ServerSocket(6666);
            System.out.println("服务器启动了!");
            while(true){
                // accept方法线程会阻塞
                System.out.println("等待连接...");
                Socket accept = serverSocket.accept();
                System.out.println("连接到一个客户端"+accept.getInetAddress().getHostName());
                InputStream inputStream = accept.getInputStream();
                cachedThreadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        // 打印客户断传来的信息
                        System.out.println("当前的线程"+Thread.currentThread().getName());
                        System.out.println("客户端"+accept.getInetAddress()+"传递来的数据");
                        handler(accept,inputStream);
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void handler(Socket accept,InputStream inputStream) {
        // 循环读取
        try {
            byte[] bytes = new byte[1024];
            while(true){
                // read方法线程会阻塞
                System.out.println("read...");
                int read = inputStream.read(bytes);
                if(read!=-1){
                    System.out.println(new String(bytes,0,read));// 输出客户端发送的数据
                }else{
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            System.out.println("关闭和"+accept.getInetAddress()+"的连接");
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                accept.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

测试:

客户端:

 服务器:

 

 

 

Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000