任务
- 用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.启动服务端程序
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,都需要扔到子线程里去处理
网友评论