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