1 代码
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class OioServer1 { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { // 创建socket服务,监听10101端口 ServerSocket server = new ServerSocket(10101); System.out.println("服务器启动!"); while (true) { // 获取一个套接字【阻塞】 final Socket socket = server.accept(); System.out.println("一个新客户端连接!"); // 单线程业务处理 handler(socket); } } /** * 读取数据 */ public static void handler(Socket socket) { try { byte[] bytes = new byte[1024]; InputStream inputStream = socket.getInputStream(); while (true) { // 读取数据【阻塞】 int read = inputStream.read(bytes); if (read != -1) { System.out.println(new String(bytes, 0, read)); } else { break; } } } catch (Exception e) { e.printStackTrace(); } finally { try { System.out.println("socket关闭"); // 必须将第1个客户端关闭,第2个客户端才可以连进来。否则只能为第1个客户端服务 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2 测试流程
利用telnet 127.0.0.1 10101模拟客户端,一个cmd窗口就是一个客户端。断点设置在server.accept()和int read = inputStream.read(bytes)位置,按F6 Step Over发现流程被阻塞。必须将第1个客户端关闭,第2个客户端才可以连进来,否则只能为第1个客户端服务。
时间: 2024-09-26 09:21:48