zoukankan      html  css  js  c++  java
  • 【从NIO到Netty】1.BIO存在的问题

    package org.scaventz.bio;
    
    import io.netty.util.CharsetUtil;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.*;
    
    public class BioEchoServer {
    
        private ServerSocket serverSocket;
        private final int PORT = 8080;
    
        private ExecutorService exec = new ThreadPoolExecutor(10, 20, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(50));
    
        public void init() throws IOException {
            serverSocket = new ServerSocket();
            serverSocket.bind(new InetSocketAddress(PORT));
        }
    
        public void startup() throws IOException {
    
            while (true) {
                System.out.println("等待连接");
                Socket socket = serverSocket.accept();
                System.out.println("与 " + socket.getInetAddress() + " 建立连接");
                exec.execute(new Thread(() -> {
                    InputStream inputStream = null;
                    OutputStream outputStream = null;
                    try {
                        inputStream = socket.getInputStream();
                        outputStream = socket.getOutputStream();
                        TimeUnit.SECONDS.sleep(2);
                        byte[] bytes = new byte[inputStream.available()];
                        inputStream.read(bytes);
                        System.out.println("[客户端-" + socket.getRemoteSocketAddress() + "]: " + new String(bytes, CharsetUtil.UTF_8));
                        outputStream.write(bytes);
                    } catch (InterruptedException | IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }));
            }
        }
    
        public static void main(String[] args) throws IOException {
            BioEchoServer server = new BioEchoServer();
            server.init();
            server.startup();
        }
    }

    上面是一段BIO模式的Server端代码

    这段代码存在的性能问题:

    1. 红色部分,线程会被阻塞
    2. 每个连接,都分配给一个单独的线程进行处理

    下一节【从BIO到Netty】2.NIO 概述我们来看看 NIO 解决这些问题的思路  

  • 相关阅读:
    搭建Git服务器
    shell脚本的使用
    谈谈递归和回溯算法的运用
    给 Qt 添加模块
    QtQuick 中的 qml 与 Qt 的 C++
    QT 中使用 c++ 的指针
    QT 的使用及编写代码遇到的问题和解决方法
    Centos 7 上安装使用 vscode
    PHP 数组转json格式,key的保存问题
    PHP compact
  • 原文地址:https://www.cnblogs.com/heben/p/13174361.html
Copyright © 2011-2022 走看看