java - 等待 ServerSocket accept() 将套接字置于 "listen"模式

标签 java asynchronous serversocket

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

我的步骤:

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

基本上,我对第 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/

相关文章:

Java 套接字编程

java - 具有多个值的开关大小写

java - IntelliJ-Android 架构 URI 未注册

java - 如何从一个 Maven 模块访问另一个 Maven 模块的 JSF 模板、类

javascript - 被拖拽的物体逃跑

swift - MVVM Realm : Passing Realm-results across threads?

java - 如何在 Glassfish 3 中列出提供的库及其版本?

asynchronous - 为什么 Future.timeout 在 dart 中不起作用?

android - 无法在 Android 上使用 ServerSocket

python - 找不到套接字服务器的匹配发行版