JavaBIO模型
目录
BIO编程
BIO编程简单流程
- 服务器端启动一个ServerSocket
- 客户端启动socket,对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通信
- 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或则被拒绝
- 如果有响应,客户端线程会等待请求结束后才继续执行
BioServer
public class BioServer {
public static void main(String[] args) throws IOException {
// 1. 创建一个线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(12,
12,
10,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(32));
// 2. 创建一个 ServerSocket
ServerSocket serverSocket = new ServerSocket(8008);
// 3. 循环监听客户端连接
while (true){
Socket socket = serverSocket.accept();
System.out.println("新连接加入");
// 线程池处理请求
threadPoolExecutor.execute(()-> {
try {
handle(socket);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
}
private static void handle(Socket socket) throws Exception {
// 定义一个byte数组,接收数据
byte[] bytes = new byte[1024];
InputStream inputStream = socket.getInputStream();
// 循环读取客户端的数据
while(true){
int read = inputStream.read(bytes);
if(read != -1){
System.out.println(new String(bytes, 0, read));
}else{
break;
}
}
}
}
BioClient
public class BioClient {
public static void main(String[] args) {
String host = "127.0.0.1";
int port = 8008;
String exit = "q";
Socket socket = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try{
//建立socket连接
socket = new Socket(host, port);
//获取输入字符流
bufferedReader = new BufferedReader(new InputStreamReader(
socket.getInputStream()
));
//获取输出字符流
bufferedWriter = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()
));
//获取输入字符流
BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String msg = scan.readLine();
//向服务器发送消息
bufferedWriter.write(msg + "\n");
bufferedWriter.flush();
//接收消息
// String line = bufferedReader.readLine();
// System.out.println("server:" + line);
if (msg.equals(exit)) {
break;
}
}
}catch (Exception e){
}finally {
try{
if(socket != null){
socket.close();
}
if(bufferedReader != null){
bufferedReader.close();
}
if(bufferedWriter != null){
bufferedWriter.close();
}
}catch (Exception e){
System.out.println("关闭异常:" + e.getMessage());
}
}
}
}
测试:
在客户端控制台输入字符在server端可以看见:
hello bio
新连接加入
hello bio