Java 如何禁用积压(无等待连接)?

Java 如何禁用积压(无等待连接)?,java,android,sockets,serversocket,Java,Android,Sockets,Serversocket,我有一个服务器,它应该打开与每个客户端的ServerSocket连接。问题是,我需要客户端检查ConnectionPort是否已经在使用中。 这意味着客户端应该检查端口12345,如果有ServerSocket“等待”或没有,则得到一个结果,如果没有,则使用下一个etc 因此,最终有两三个客户端连接到服务器的端口12345、12346、12347 我写道: serverSocket = new ServerSocket(incomingPort, 1); // backlog 1 = Minim

我有一个服务器,它应该打开与每个客户端的
ServerSocket
连接。问题是,我需要客户端检查ConnectionPort是否已经在使用中。 这意味着客户端应该检查端口12345,如果有
ServerSocket
“等待”或没有,则得到一个结果,如果没有,则使用下一个etc

因此,最终有两三个客户端连接到服务器的端口12345、12346、12347

我写道:

serverSocket = new ServerSocket(incomingPort, 1); // backlog 1 = Minimum
incomingSocket = serverSocket.accept();
readerIn = new BufferedReader(new InputStreamReader(incomingSocket.getInputStream()));

outgoingSocket = new Socket(incomingSocket.getInetAddress().getHostAddress(), outgoingPort);
dataOutputStream = new BufferedOutputStream(outgoingSocket.getOutputStream());
pwOut = new OutputStreamWriter(outgoingSocket.getOutputStream());
我连接了第一个客户机,并打开(在最后三行中)另一个“返回”到客户机的连接。在客户端,我写了几乎相同的内容,相反:

outgoingSocket = new Socket(serverIP, inPort1);
dataOutputStream = new BufferedOutputStream(outgoingSocket.getOutputStream());
pwOut = new OutputStreamWriter(outgoingSocket.getOutputStream());

serverSocket = new ServerSocket(outPort1);
incomingSocket = serverSocket.accept();
readerIn = new BufferedReader(new InputStreamReader(incomingSocket.getInputStream()));
下一个尝试打开连接的客户机也在这样做,从同一端口开始。我希望得到一个
异常
,比如
ConnectException
之类的异常,但什么都没有。我想这与积压工作“缓冲区”有关。它将继续处理所有内容,并等待成为一个
ServerSocket
,但它将永远等待。服务器本身已被第一个连接占用


我读过很多帖子,但他们都说,
outgoingSocket.isConnected()
给出的是
true
,而
.isClosed()
给出的是
false
,至少在超时之前是这样。有没有办法确定服务器已被占用?或者至少“禁用”积压以便拒绝所有传入连接?

回答您的直接问题-否,您不能禁用侦听TCP套接字积压队列,即使它设置为
1
-这是挂起的数量,即尚未由应用程序、连接请求启用的
accept()
。一旦您接受了第一个客户端连接,您可以在那里做的就是关闭服务器套接字


那么真正的东西-为什么你认为你需要两个这样的插座?单个TCP连接是全双工的,即您可以双向通信。

我不确定您是否理解客户机-服务器通信和套接字接口的概念。从服务器到客户端的通信不需要创建新的套接字,TCP连接是双向的,您可以写入从中读取的同一套接字

为了客户机服务器的利益,请参考官方文档,或遵循完整的说明

如果您仍然希望继续您的方法,即服务器只接受一个连接,则需要在接受连接后关闭服务器中的
serverSocket
。使用
incomingSocket
类仍然可以进行通信

我有一个服务器,它应该打开到的SocketServer连接 每个客户

不,你没有。没有所谓的“SocketServer连接”,TCP服务器创建一个
ServerSocket
,并接受来自客户端的连接。是客户端打开了连接

问题是,我需要客户检查 ConnectionPort已在使用中

不,你没有。所有客户端都连接到相同的端口号。客户不需要检查任何东西

这意味着客户应检查: 端口12345,如果服务器套接字“正在等待”或 不如果没有,他们将采取下一步行动

不,没有。客户端只是连接到侦听端口。时期你完全误解了整个过程


我建议您阅读并查看一些代码示例,然后重新开始。

首先确保您了解客户机-服务器通信模型。不需要增加服务器中的端口。许多客户端可以连接到服务器上的同一端口。我知道它们可以连接到服务器上的同一端口。那么你的意思是,我应该为每个客户机/服务器使用相同的端口,只需使用不同的IP地址就可以了?不,每个连接都有不同的
incomingSocket
s<代码>服务器套接字保持不变。因此,您可以通过读/写适当的套接字来区分它们。阅读更多:好的。看来我误解了这一点。非常感谢,我将在这里继续学习所有答案。谢谢大家的快速回复!:-)是的,我已经注意到我对这件事的理解不是最好的。谢谢你的提示。我又在做作业了。:-)