BIO的阻塞
java的网络编程大概可以分为BIO,NIO,AIO三种
第一种BIO是传统的io流为基础的,他是一种阻塞式的。
这是客户端
public class Client { public static void main(String[] args) { Scanner se=new Scanner(System.in); System.out.println("请输入客户端编号:"); int code=se.nextInt(); System.out.println("客户端编号是:"+code); Socket socket=null; try { System.out.println("客户端"+code+"开始连接服务器..."); socket=new Socket("127.0.0.1",8888); if(socket!=null){ System.out.println("客户端"+code+"连接服务器成功!"); } OutputStream out= socket.getOutputStream(); while (true){ System.out.println("客户端"+code+"请输入要发送的内容:"); String str=se.next(); if(str.trim().equalsIgnoreCase("quit")) break; out.write((code+"--->"+str).getBytes("utf-8")); } out.close(); socket.close(); }catch (Exception ex){ ex.printStackTrace(); } }
这是服务端
public class Server { private static int port=8888; public static void main(String[] args) throws IOException { ServerSocket serverSocket=null; try{ serverSocket=new ServerSocket(port); System.out.println("服务端开始监听:"+port); while (true){ var clientSocket= serverSocket.accept();//第一处阻塞 System.out.println("接受一个客户端请求"); InputStream in=clientSocket.getInputStream(); int hasread=0; byte[] bufer=new byte[1024]; while ((hasread=in.read(bufer))!=-1){//第二处阻塞 System.out.println("客户端输入字符:"+new String(bufer,0,hasread)); } clientSocket.close(); in.close(); } } catch (Exception ex){ ex.printStackTrace(); }finally { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
服务端在监听客户端,和接收客户端时,是阻塞的状态。
单独把服务端运行
程序阻塞在监听方法处
起一个客户端
显示连接服务器成功
此时服务器阻塞在读取客户端输入的文字处
此时通信成功,然而程序时在不停的循环等待中。
此时在起一个客户端,并发送内容
服务器是收不到内容的,因为他阻塞等待客户端1发送内容,此时把客户端1关停。
服务端收到了客户端2的信息。
所以说,这个BIO是阻塞式的,要想实现多个客户端同时发送信息。需要多个线程。