我需要一个简单的客户端-服务器通信来实现单元测试。
我的步骤:
- 创建服务器线程
- 等待服务器线程将服务器套接字置于监听模式 (serverSocket.accept())
- 创建客户
- 提出一些请求,验证响应
基本上,我对第 2 步有疑问。当服务器套接字处于“监听”状态时,我找不到向我发出信号的方法。在这种情况下,可以异步调用“accept”,但 java 不支持这一点(它似乎只支持异步 channel ,根据文档,这些 channel 与“accept()”方法不兼容)。
因为我可以放置一个简单的“ sleep ”,但这并不是生产代码的真正解决方案。
因此,总而言之,我需要在不使用 sleep 和/或轮询的情况下检测 ServerSocket 何时进入监听模式。
最佳答案
一旦您构造ServerSocket
对象,套接字就会进入监听状态,而不是在您调用accept
时。只要在 ServerSocket
构造函数完成后创建客户端,就不会有问题。连接将被接受并在内部排队,直到 accept
被调用。
下面是一些代码来演示:
ServerSocket serverSocket = new ServerSocket(12345);
Thread.sleep(10000);
Socket socket = serverSocket.accept();
在 accept
被调用之前的 10 秒间隔内,OS netstat 命令将显示服务器套接字处于“LISTENING”状态,客户端可以连接到它。如果客户端在这 10 秒内连接,连接将被排队,当 accept
方法最终被调用时,它会立即返回排队的 Socket
对象。
关于java - 等待 ServerSocket accept() 将套接字置于 "listen"模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4553380/