2

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

所以最终有两三个客户端连接到服务器上的端口 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()));

下一个尝试打开连接的客户端也在做同样的事情,从同一个端口开始。我希望得到一个Exception像一个ConnectException或这样的,但没有。我想这与积压的“缓冲区”有关。它继续一切并等待成为a ServerSocket,但它会永远等待。服务器本身已经被第一个连接占用。

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

4

3 回答 3

4

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

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

于 2012-08-09T21:03:08.813 回答
3

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

客户端-服务器的好例子请参考官方文档,或者按照完整的TUTORIAL进行。

如果你仍然想继续你的方法,服务器只接受一个连接,你需要serverSocket在接受连接后关闭服务器。incomingSocket使用您的班级仍然可以进行交流。

于 2012-08-09T21:04:52.237 回答
1

我有一个服务器,它应该为每个客户端打开一个 SocketServer 连接。

不,你没有。没有“SocketServer Connection”之类的东西,TCP 服务器创建一个ServerSocket接受来自客户端的连接。打开连接的是客户端。

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

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

这意味着客户端应该检查:端口 12345 并得到一个结果,如果有一个 ServerSocket “等待”或没有。如果不是,他们会采取下一个等

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

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

于 2012-08-09T22:22:47.557 回答