等待ServerSocket accept()将socket置于"listen"模式

ina*_*ruk 2 java asynchronous serversocket

我需要一个简单的客户端 - 服务器通信才能实现单元测试.

我的步骤:

  1. 创建服务器线程
  2. 等待服务器线程将服务器套接字置于监听模式(serverSocket.accept())
  3. 创建客户端
  4. 提出一些要求,验证回复

基本上,我对第2步有问题.当服务器套接字处于"监听"状态时,我找不到向我发信号的方法.在这种情况下,对"accept"的异步调用会起作用,但是java不支持这种情况(它似乎只支持异步通道,而且根据文档,它们与"accept()"方法不兼容).

因为我可以放一个简单的"睡眠",但这并不是生产代码的真正解决方案.

因此,总而言之,我需要检测ServerSocket何时进入侦听模式而不使用睡眠和/或轮询.

Joe*_*ley 5

一旦构造ServerSocket对象,套接字就会进入侦听状态,而不是在您调用时accept.只要在ServerSocket构造函数完成后创建客户端,就不会有问题.连接将被接受并在内部排队,直到accept被调用.

以下是一些演示代码:

ServerSocket serverSocket = new ServerSocket(12345);
Thread.sleep(10000);
Socket socket = serverSocket.accept();
Run Code Online (Sandbox Code Playgroud)

accept调用之前的10秒间隙期间,OS netstat命令将显示处于"LISTENING"状态的服务器套接字,并且客户端可以连接到它.如果客户端在该10秒内连接,则连接将排队,并且当accept最终调用该方法时,它会立即返回排队的Socket对象.