- 优点
模型简单 编码简单
- 缺点
性能瓶颈 请求数和线程数1:1的关系。高并发情况下,CPU切换线程上下文损耗大
- 案例
web服务器tomcat7之前都是bio,7之后使用的是bio
- 改进
使用线程池接受 socket
-
bio模型
bio模型
-
重点类
ServerSocket , Socket = server.accept()
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
public class Server {
public static ExecutorService executorService =
new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<>(20));
public static void main(String[] args) {
ServerSocket server = null;
try {
ServerHandler serverHandler= new ServerHandler();
server = new ServerSocket(8888);
while (true){
Socket accept = server.accept();
executorService.execute(() -> serverHandler.run(accept));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//一些必要的清理工作
if(server != null){
System.out.println("服务器已关闭。");
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
public class ServerHandler {
public void run(Socket socket) {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
String body = null;
while ((body = in.readLine()) != null && body.length() != 0) {
System.out.println("接受到的消息:" + body);
out.println(new Date());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
out.close();
}
}
}
}
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
send("1234");
}
public static void send(String expression){
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
try{
socket = new Socket( "127.0.0.1",8888);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(expression);
System.out.println("___结果为:" + in.readLine());
}catch(Exception e){
e.printStackTrace();
}finally{
//一下必要的清理工作
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null){
out.close();
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
网友评论