BIO含义
BIO简单使用
1、客户端:连接本地的8000端口,并发送一个数据到服务器
public class BIOClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8000);
OutputStream out = socket.getOutputStream();
Scanner scanner = new Scanner(System.in);
System.out.println("enter: ");
String s = scanner.nextLine();
out.write(s.getBytes());
scanner.close();
socket.close();
}
}
2、服务器开启8000端口,并监听客户端的连接,接收客户端传递的数据进行打印:
- 版本1,单线程版本,一次只能接受一个客户端的连接
public class BIOServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("server started.....");
while (!serverSocket.isClosed()) {
Socket request = serverSocket.accept(); // 阻塞
System.out.println("accepted new connection from " + request.toString());
try {
InputStream inputStream = request.getInputStream(); // net + io
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String msg;
while ((msg = reader.readLine()) != null) { // 没有数据也会阻塞
if (msg.length() == 0) {
break;
}
System.out.println(msg);
}
System.out.println("accepted data from " + request.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
request.close();
}
}
serverSocket.close();
}
}
- 版本2,使用线程池,可以一次接受多个客户端的连接,接收到连接后交由线程池去处理后续的接收数据、打印数据的任务
public class BIOServerV1 {
private static ExecutorService threadPool = Executors.newCachedThreadPool();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("server started......");
while (!serverSocket.isClosed()) {
Socket request = serverSocket.accept();
System.out.println("accepted new connection from " + request.toString());
threadPool.execute(() -> {
try {
InputStream inputStream = request.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String msg;
while ((msg = bufferedReader.readLine()) != null) { // 没有数据会阻塞
if (msg.length() == 0) break;
System.out.println("received data: " + msg);
}
System.out.println("received data from " + request.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
request.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
serverSocket.close();
}
}