客户端连接到ServerSocket而不接受 - 为什么?

时间:2015-02-18 20:07:43

标签: java sockets connect serversocket acceptance

我希望我的问题的答案是指向文档的指针。但是,如果合适,我可以发布bug搜索代码。

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

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

  1. 创建了一个绑定到192.168.1.63:3456的新ServerSocket对象(本地 地址和本地(众所周知的)端口),将backlog参数设置为0.此对象 代表通常在微控制器中的代码。
  2. 创建了一个绑定到192.168.1.63:3456和的新(客户端)Socket对象 192.168.1.63:0(远程地址,远程端口,本地地址,本地 port(emphemeral port的占位符))。这个对象代表了 通常在Wintel计算机中的代码/对象。
  3. 在我调用ServerSocket的accept()方法之前,我预计上面第2项中的新Socket创建会阻塞(不连接)。相反,Socket创建尝试(以及Socket的隐式连接尝试)立即产生了一个新的(客户端)Socket对象;并且我的(客户端)代码的执行继续(接下来的几条指令是.setReuseAddress(true),. getInputStream(),. getOutputStream()等)。

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

    有人能指出我对我所见到的解释(客户端的连接尝试在服务器接受()之前完成)吗?

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

    PS:以防万一......当我看到这种行为(上面)时运行的代码是单线程的。在任何人指出它必须在它完全成功之前变成多线程之前;我知道。无论如何,我并不期待我上面描述的内容。

1 个答案:

答案 0 :(得分:2)

  

积压参数为0

平台可以调高或调低。见Javadoc。最低积压值从未低于5,在某些平台上现在为5甚至500。

  

我在Java API文档中读过的所有内容都明确或隐含地说,ServerSocket accept()调用允许套接字完成连接到ServerSocket的过程

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

  

(实际上是ServerSocket创建的新Socket ...);但是在调用ServerSocket accept()之前,我的Socket已经退出了比赛。

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

这一切都很正常。你的期望是错误的。

如果它“弄乱了他们两个人”你的代码就会出现问题。客户端完成连接并发送请求并在服务器调用accept().之前等待回复是完全正常的