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是阻塞式的,要想實現多個客戶端同時發送信息。需要多個線程。