我希望我的问题的答案是指向文档的指针。但是,如果合适,我可以发布bug搜索代码。
为了简化在家工作,我试图在单个Wintel OS /计算机中模拟将在微控制器中运行的服务器与将在Wintel PC中运行的Java客户端之间的交互。如果模拟足够好,我就不必将微控制器设备带回家,只是为PC关系开发软件。
因此,在单个Wintel计算机(家中)的单个JVM中,我这样做了:
在我调用ServerSocket的accept()方法之前,我预计上面第2项中的新Socket创建会阻塞(不连接)。相反,Socket创建尝试(以及Socket的隐式连接尝试)立即产生了一个新的(客户端)Socket对象;并且我的(客户端)代码的执行继续(接下来的几条指令是.setReuseAddress(true),. getInputStream(),. getOutputStream()等)。
我在Java API文档中读到的所有内容都明确或隐含地说,ServerSocket accept()调用允许套接字完成连接到ServerSocket的过程(实际上是ServerSocket创建的新Socket ...);但是在调用ServerSocket accept()之前,我的Socket已经退出了比赛。
有人能指出我对我所见到的解释(客户端的连接尝试在服务器接受()之前完成)吗?
希望这个解释能让我知道如何创建一个合适的模拟(一个不需要特殊代码的模拟,因为客户端和服务器都在一台计算机上)。
PS:以防万一......当我看到这种行为(上面)时运行的代码是单线程的。在任何人指出它必须在它完全成功之前变成多线程之前;我知道。无论如何,我并不期待我上面描述的内容。
答案 0 :(得分:2)
积压参数为0
平台可以调高或调低。见Javadoc。最低积压值从未低于5,在某些平台上现在为5甚至500。
我在Java API文档中读过的所有内容都明确或隐含地说,ServerSocket accept()调用允许套接字完成连接到ServerSocket的过程
一切如何?请提供引文。我不知道任何证据证明这种错误信念的文件。 accept()
返回的套接字表示可能已从客户端的角度完全形成的连接。这就是积压队列的用途。
(实际上是ServerSocket创建的新Socket ...);但是在调用ServerSocket accept()之前,我的Socket已经退出了比赛。
您的连接已由TCP堆栈完成并放置在积压队列中。 accept()
所做的就是创建本地套接字作为其端点,甚至可能不是。
这一切都很正常。你的期望是错误的。
如果它“弄乱了他们两个人”你的代码就会出现问题。客户端完成连接并发送请求并在服务器调用accept().
之前等待回复是完全正常的