如何禁用积压(没有等待连接)?

时间:2012-08-09 20:50:18

标签: java android sockets serversocket

我有一台服务器应该打开与每个客户端的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()));

尝试打开连接的下一个客户端也是这样做的,从同一个端口开始。我希望得到ExceptionConnectException左右,但没有。我猜这与积压“缓冲区”有关。它继续一切,等待成为ServerSocket,但它永远等待。服务器本身已经占用了第一个连接。

我阅读了很多帖子,但他们都说outgoingSocket.isConnected()正在提供true.isClosed()正在提供false,至少要等到超时。有没有办法确定服务器已被占用?或者至少“禁用”积压,以便拒绝所有传入的连接?

3 个答案:

答案 0 :(得分:4)

回答您的直接问题 - 不,您无法禁用侦听TCP套接字积压队列,即使它已设置为1 - 这是 待处理的数量 ,即尚未accept() - 由应用程序,连接请求。一旦您接受了第一个客户端连接,您可以在close()服务器套接字执行此操作。

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

答案 1 :(得分:3)

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

请参阅官方文档,了解客户端服务器的良好EXAMPLE,或按照完整的TUTORIAL进行操作。

如果您仍想继续使用您的方法,服务器只接受单个连接,则需要在接受连接后关闭服务器中的serverSocket。使用incomingSocket课程仍然可以进行沟通。

答案 2 :(得分:1)

  

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

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

  

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

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

  

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

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

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