-
模型
BIO.png
这种模型每有一个客户端进行连接,服务端就会创建一个线程进行处理。
- demo实例如下:
Server:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(); // 实际中要做try catch处理
serverSocket.bind(new InetSocketAddress("127.0.0.1", 8888));
while (true) {
Socket socket = serverSocket.accept(); // 阻塞方法
new Thread(() -> {
handle(socket);
}).start();
}
}
static void handle (Socket socket) {
try {
byte[] bytes = new byte[1024];
int length = socket.getInputStream().read(bytes); // 阻塞
System.out.println(new String(bytes, 0, length));
// 通道是单向的
socket.getOutputStream().write(bytes, 0, length); // 阻塞
socket.getOutputStream().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client:
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
socket.getOutputStream().write("[Client]-->Hello Server".getBytes());
socket.getOutputStream().flush();
System.out.println("write over, waiting for msg back ...");
byte[] bytes = new byte[1024];
int len = socket.getInputStream().read(bytes);
System.out.println(new String(bytes, 0, len));
socket.close();
}
}
- 为什么要创建一个新的线程?
因为bio的server是阻塞的(accept是阻塞方法),处理client连接时若由server直接处理,这时其它client将不能连接。
此外 handle 方法中 read 和 write 也是阻塞的,如果只是建立了连接而没有传数据,也会阻塞。
由于bio中各种阻塞,所以效率特别低,并发性也不好,在实际网络编程中很少使用。但是在client少,并发量低的情况下bio简单方便也可使用。
网友评论