美文网首页
一个简单的BIO服务器示例2

一个简单的BIO服务器示例2

作者: 周大聪明 | 来源:发表于2019-01-26 11:06 被阅读0次

    任务

    对示例1进行的优化https://www.jianshu.com/p/eb3f0d565a35

    • 用BIO编写服务端程序
    • 服务端负责打印客户端传来的字符串
    • 要能支持并发连接

    编码

    我们需要写两个类,一个专门用来处理连接的子线程类,一个专门用来监听客户端连接请求的主线程类。

    /**
     * Description: 专门用来处理连接的子线程类
     * @date 2019/1/18 15:03
     * @author 周渊 (563812566@qq.com)
     * @version 1.0
     */
    public class SocketHandler extends Thread{
    
        private Socket socket;
    
        public SocketHandler(Socket socket){
            this.socket = socket;
        }
    
        @Override
        public void run() {
            try {
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String lineStr;
                while(!(lineStr = input.readLine()).equals("exit")){
                    System.out.println(lineStr);
                }
                this.socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    /**
     * Description: 专门用来监听客户端连接请求的主线程类
     * @date 2019/1/18 15:03
     * @author 周渊 (563812566@qq.com)
     * @version 1.0
     */
    public class SimpleBIOServer {
        public static void main(String[] args){
            try {
                while(true){
                    ServerSocket server = new ServerSocket(5555);
                    Socket socket = server.accept();
                    new SocketHandler(socket).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    验证

    可以参考示例1中,用telnet的方式进行验证

    总结

    BIO要支持并发的话,必须:

    • 主线程里面,应该在循环中调用server.accept()以持续监听客户端连接请求
    • 每建立一个连接,都应该把socket扔到子线程去处理,以防止读写操作阻塞挂起线程

    思考

    BIO的性能瓶颈在哪里?
    1、线程数越多,线程间切换的开销越大。
    2、线程数不可能无限增长。
    3、阻塞可能浪费性能。有可能客户端很长时间内什么都没干,但是服务端线程不得不阻塞等待它操作。

    相关文章

      网友评论

          本文标题:一个简单的BIO服务器示例2

          本文链接:https://www.haomeiwen.com/subject/npdyjqtx.html