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

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

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

    任务

    • 用BIO写一个服务器程序
    • 在服务端打印客户端传来的字符串
    • 用telnet命令向服务器发消息验证结果并分析BIO特点

    编码

    public class SimpleSingleThreadBIOServer {
        public static void main(String[] args){
            try {
                ServerSocket server = new ServerSocket(5555);
                System.out.println("服务端已启动");
                Socket socket = server.accept();
                System.out.println("获取客户端连接");
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String lineStr;
                System.out.println("准备接收数据");
                while(!(lineStr = input.readLine()).equals("exit")){
                    System.out.println(lineStr);
                }
                socket.close();
                System.out.println("服务端已关闭");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    验证

    1.启动服务端程序

    image.png
    2.通过telnet命令连接服务端
    在命令行输入telnet localhost 5555
    windows下telnet客户端是不开启的,请自行百度开启telnet客户端
    image.png
    连接成功后,命令行进入黑板界面
    image.png
    连接成功后,服务端准备接收数据
    image.png
    给服务端随便发几条消息
    image.png
    另外开一个命令行,用telnet连接服务端并发送消息,我们发现服务端毫无反应
    image.png
    给服务端发送exit,发现服务端退出
    image.png

    总结

    • BIO编程模型简单,复杂度低
    • server.accept()方法会阻塞,直到一个连接建立
    • input.readLine()方法会阻塞,直到客户端发送新的一行数据
    • 在此例中,无法并发建立多连接

    那么问题来了,如果要并发,我们需要怎么办?
    1.建立连接需要调用server.accept(),所以我们在循环里调用它
    2.但是它又是阻塞的,所以我们每拿到个socket,都需要扔到子线程里去处理

    相关文章

      网友评论

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

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