我有一台服务器应该打开与每个客户端的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
左右,但没有。我猜这与积压“缓冲区”有关。它继续一切,等待成为ServerSocket
,但它永远等待。服务器本身已经占用了第一个连接。
我阅读了很多帖子,但他们都说outgoingSocket.isConnected()
正在提供true
而.isClosed()
正在提供false
,至少要等到超时。有没有办法确定服务器已被占用?或者至少“禁用”积压,以便拒绝所有传入的连接?
答案 0 :(得分:4)
回答您的直接问题 - 不,您无法禁用侦听TCP套接字积压队列,即使它已设置为1
- 这是 待处理的数量 ,即尚未accept()
- 由应用程序,连接请求。一旦您接受了第一个客户端连接,您可以在close()
服务器套接字执行此操作。
那么真实的东西 - 为什么你认为你需要这样的两个插座?单个TCP连接是全双工,即您可以双向通信。
答案 1 :(得分:3)
我不确定您是否理解客户端 - 服务器通信和套接字接口的概念。您不需要创建一个新的套接字来从服务器到客户端进行通信,TCP连接是双向的,您可以写入您从中读取的同一个套接字。
请参阅官方文档,了解客户端服务器的良好EXAMPLE,或按照完整的TUTORIAL进行操作。
如果您仍想继续使用您的方法,服务器只接受单个连接,则需要在接受连接后关闭服务器中的serverSocket
。使用incomingSocket
课程仍然可以进行沟通。
答案 2 :(得分:1)
我有一个应该打开SocketServer连接的服务器 每个客户。
不,不。没有“SocketServer连接”这样的东西,TCP服务器创建一个ServerSocket
和接受来自客户端的连接。是打开连接的客户。
问题是,我需要客户端检查是否 ConnectionPort已经在使用中。
不,不。所有客户端都连接到相同的端口号。客户不必检查任何东西。
这意味着客户应该检查: 端口12345并获得一个结果,如果有一个ServerSocket“等待”或 不。如果没有他们采取下一个等
不,不。客户端只是连接到侦听端口。期。你完全误解了整个过程。
我建议你做一些阅读并查看一些代码示例,然后重新开始。