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

时间:2010-12-29 10:44:32

标签: java asynchronous serversocket

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

我的步骤:

  1. 创建服务器线程
  2. 等待服务器线程将服务器套接字置于侦听模式(serverSocket.accept())
  3. 创建客户
  4. 提出一些请求,验证回复
  5. 基本上,我对第2步有问题。当服务器套接字处于“监听”状态时,我找不到向我发信号的方法。在这种情况下,对“accept”的异步调用会起作用,但是java不支持这种情况(它似乎只支持异步通道,而且根据文档,它们与“accept()”方法不兼容)。

    原因我可以简单地“睡觉”,但这不是生产代码的真正解决方案。

    因此,总而言之,我需要检测何时将ServerSocket置于监听模式而不使用睡眠和/或轮询。

2 个答案:

答案 0 :(得分:5)

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

以下是一些要演示的代码:

ServerSocket serverSocket = new ServerSocket(12345);
Thread.sleep(10000);
Socket socket = serverSocket.accept();

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

答案 1 :(得分:-1)

为什么不在调用accept()之前发送单个?

connectionAccepted = true;
loc.notify();
socket.accept();

要确保套接字准备就绪,请在“客户端”代码中添加一个小小的睡眠:

wait();
// we are here when notify is called.
Thread.sleep(10); // 10 ms
startTest();

你甚至可以做得更好:创建循环尝试在尝试之间以微小的睡眠“ping”套接字。在这种情况下,您将尽可能快地开始测试。