从零学Netty(一)BIO通信

BIO概念

同步阻塞I/O模式,全称BlockingIO,数据的读取写入必须阻塞在一个线程内等待其完成

它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。

它的优点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。

原理图

图片来源:https://mp.weixin.qq.com/s/CRd3-vRD7xwoexqv7xyHRw

实例demo

服务端代码

/**
 * bio服务端
 *
 * @author LionLi
 */
public class BioServer {

    public static void main(String[] args) {
        try {
            // 创建服务端socket
            ServerSocket server = new ServerSocket(8088);
            System.out.println("服务端启动成功!!!");
            // 堵塞
            Socket socket = server.accept();
            // 创建消息处理器
            new ServerHandler(socket);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

服务端消息处理器

/**
 * bio服务端消息处理
 *
 * @author LionLi
 */
public class ServerHandler {

    public ServerHandler(Socket socket) {
        try (InputStreamReader isr = new InputStreamReader(socket.getInputStream());
             BufferedReader br = new BufferedReader(isr);
             PrintWriter pw = new PrintWriter(socket.getOutputStream(), true)) {
            String body;
            Scanner scanner = new Scanner(System.in);
            while (true) {
                // 读取客户端消息
                body = br.readLine();
                if (body == null) {
                    break;
                }
                System.out.println("客户端: " + body);
                String s = scanner.nextLine();
                System.out.println("服务端: " + s);
                // 发送到客户端
                pw.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

客户端代码

/**
 * bio客户端
 *
 * @author LionLi
 */
public class BioClient {

    public static void main(String[] args) {

        try (Socket socket = new Socket("localhost", 8088);
             InputStreamReader isr = new InputStreamReader(socket.getInputStream());
             BufferedReader br = new BufferedReader(isr);
             PrintStream ps = new PrintStream(socket.getOutputStream())) {

            System.out.println("请输入内容: ");
            Scanner scanner = new Scanner(System.in);
            String str = scanner.nextLine();
            System.out.println("客户端: " + str);
            // 发送到服务端
            ps.println(str);
            String response;
            while (true) {
                // 读取服务端消息
                response = br.readLine();
                if (response == null || response.length() == 0) {
                    break;
                }
                System.out.println("服务端: " + response);
                String client = scanner.nextLine();
                System.out.println("客户端: " + client);
                ps.println(client);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

非常简单的一个通讯

测试

启动服务端

启动客户端

客户端发送消息给服务端

服务端回复消息

项目已上传到gitee

地址: netty-demo

如果帮到您了,请帮忙点个star

猜你喜欢

转载自blog.csdn.net/weixin_40461281/article/details/108992752