我需要一个简单的客户端 - 服务器通信才能实现单元测试。
我的步骤:
基本上,我对第2步有问题。当服务器套接字处于“监听”状态时,我找不到向我发信号的方法。在这种情况下,对“accept”的异步调用会起作用,但是java不支持这种情况(它似乎只支持异步通道,而且根据文档,它们与“accept()”方法不兼容)。
原因我可以简单地“睡觉”,但这不是生产代码的真正解决方案。
因此,总而言之,我需要检测何时将ServerSocket置于监听模式而不使用睡眠和/或轮询。
答案 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”套接字。在这种情况下,您将尽可能快地开始测试。