4

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

我的步骤:

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

基本上,我对第 2 步有疑问。当服务器套接字置于“监听”状态时,我找不到向我发出信号的方法。在这种情况下,可以异步调用“accept”,但 java 不支持这一点(它似乎只支持异步通道,并且根据文档,这些通道与“accept()”方法不兼容)。

当然,我可以放一个简单的“睡眠”,但这并不是生产代码的真正解决方案。

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

4

2 回答 2

7

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

下面是一些代码来演示:

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

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

于 2010-12-29T11:21:38.337 回答
-1

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

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

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

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

你甚至可以做得更好:创建循环尝试“ping”套接字,并在两次尝试之间稍作休眠。在这种情况下,您将尽快开始测试。

于 2010-12-29T10:50:39.247 回答