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是阻塞式的,要想实现多个客户端同时发送信息。需要多个线程。