任务
对示例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、阻塞可能浪费性能。有可能客户端很长时间内什么都没干,但是服务端线程不得不阻塞等待它操作。
网友评论