java - 客户端在不接受的情况下连接到 ServerSocket - 为什么?

标签 java sockets connect serversocket acceptance

这个问题在这里已经有了答案:





Can 'connect' call on socket return successfully without server calling 'accept'?

(2 个回答)


7年前关闭。




我希望我的问题的答案是指向文档的指针。但是,如果合适的话,我可以发布代码以寻找错误。

为了简化在家工作,我试图在单个 Wintel 操作系统/计算机中模拟将在微 Controller 中运行的服务器与将在 Wintel PC 中运行的 Java 客户端之间的交互。如果模拟足够好,我就不必将微 Controller 设备带回家只是为关系的 PC 端开发软件。

因此,在单个 Wintel 计算机(在家)中的单个 JVM 中,我这样做了:

  • 创建了一个绑定(bind)到 192.168.1.63:3456 的新 ServerSocket 对象(本地
    地址和本地(知名)端口),backlog 参数设置为 0。此对象
    表示通常在微 Controller 中的代码。
  • 创建了一个绑定(bind)到 192.168.1.63:3456 和
    192.168.1.63:0(远程地址,远程端口,本地地址,本地
    端口(临时端口的占位符))。这个对象代表
    通常将在 Wintel 计算机中的代码/对象。

  • 我希望在上面第 2 项中创建的新 Socket 会阻塞(不连接),直到我调用 ServerSocket 的 accept() 方法。相反,Socket 创建尝试(以及 Socket 的隐式连接尝试)立即产生了一个新的(客户端)Socket 对象;我的(客户端)代码继续执行(接下来的几条指令是 .setReuseAddress(true)、.getInputStream()、.getOutputStream() 等)。

    我在 Java API 文档中读到的所有内容都明确或隐含地表明,ServerSocket accept() 调用允许 Sockets 完成连接到 ServerSocket 的过程(实际上是到 ServerSocket 创建的新 Socket ......);但是在 ServerSocket accept() 调用之前,我的 Socket 已经参加了比赛。

    谁能指出我所看到的解释(客户端的连接尝试在服务器的 accept() 之前完成)?

    希望这个解释能让我知道如何创建一个适当的模拟(不需要特殊代码,因为客户端和服务器都在一台计算机上)。

    PS:以防万一......当我看到这种行为(上图)时运行的代码是单线程的。在有人指出它必须成为多线程才能完全成功之前;我知道。无论如何,我没想到我上面描述的。

    最佳答案

    a backlog parameter of 0



    平台将向上或向下调整。请参阅 Javadoc。最小积压值从未低于 5,现在在某些平台上为 50 甚至 500。

    Everything I have read in the Java API docs says explictly or implicitly that ServerSocket accept() invocations are what allow Sockets to complete the process of connecting to the the ServerSocket



    一切如什么?请提供引用。我不知道任何地方有任何文件证明这种错误信念是正当的。 accept() 返回的套接字表示从客户端的角度来看可能已经完全形成的连接。这就是积压队列的用途。

    (actually to the new Socket the ServerSocket creates...); but my Socket was off to the races before a ServerSocket accept() invocation.



    您的连接由 TCP 堆栈完成并放置在积压队列中。所有 accept()确实是创建本地套接字作为其端点,甚至可能不是。

    这都是正常的。你的期望是不正确的。

    如果它“弄乱了他们俩”,那么您的代码中就有错误。在服务器调用 accept(). 之前,客户端完成连接并发送请求并等待回复是完全正常的。

    关于java - 客户端在不接受的情况下连接到 ServerSocket - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592927/

    相关文章:

    java - 如何测试(java)流畅的 API?

    java - java中的输入不匹配错误

    c - TCP_KEEPIDLE 应该低于 TCP_KEEPINTVL 吗?

    node.js - coffeescript 的连接中间件?

    java - 必须使用 javaFX 搜索和删除按钮制作地址簿

    java - pig 中元组的转换

    c - sendmmsg()返回-1,没有可用的缓冲区空间,为什么memset解决这个问题?

    c++ - 客户端未收到 UDP 连接响应

    node.js + 连接 404 错误

    python - 想要连接到 dynamoDB,得到 AttributeError : 'module' object has no attribute 'connect_to_region'