Java - 我如何检查ServerSocket.accept()是否编辑了连接?

时间:2016-10-22 22:02:42

标签: java multithreading sockets server client-server

我正在尝试编写简单的服务器 - 客户端聊天解决方案。出于测试目的,我正在创建一个包含2个serverThreads的数组,它们负责从连接的客户端发送和接收消息。

我希望服务器在连接的客户端数量达到最大值后拒绝连接。但是,即使服务器不接受连接,也会创建客户端上的套接字。方法socket.isBound和isConnected都返回true值。

回到主要问题。 您有什么想法,当ServerSocket无法连接时,我怎么能拒绝连接客户端.accept()附加连接?

这是Server类的代码。

System.out.println("Read line: "+nextline)

3 个答案:

答案 0 :(得分:0)

而不是在waitForClient方法中使用true,而不是尝试此

private final int allowedClients = 10;
private int connectedClients = 0;
public void waitForClient () {

boolean isLogPrinted = false;

while (connectedClients <= allowedClients){
    try {
       if (clientCount < serverThread.length){
           System.out.println ("Waiting for connection...");
           isLogPrinted = false;
           addThread (serverSocket.accept());
           connectedClients++;
           System.out.println("Client count: " + clientCount);
       }
       else {
           if (!isLogPrinted){
                System.out.println("MAXIMUM NUMBER OF CLIENTS REACHED! (" + clientCount + ").");
                isLogPrinted = true;
           }
       }
   } catch (IOException e) {
       System.out.println("Error while waiting for new clients to connect: " + e.getMessage());
        }

} }

答案 1 :(得分:0)

  

我希望服务器在连接的客户端数量达到最大值后拒绝连接。

关闭服务器套接字。

  

但是,即使服务器不接受连接,也会创建客户端上的套接字。方法socket.isBoundisConnected都返回true值。

正确。这是因为TCP维护了一个&#39;积压队列&#39;服务器应用程序已完成butnnotnyetvacceoted的传入连接。

  

回到主要问题。你有什么想法,当ServerSocket无法连接时,我怎么能拒绝连接客户端.accept()附加连接?

在连接数达到最大值时关闭服务器套接字。

然而,由于积压,这种技术永远不会是完美的。没有完美的解决方案。您可以让服务器立即关闭多余的连接,但多余的客户端在尝试发送内容之前不会检测到它。如果您需要完美,您可能需要引入一个应用程序协议,服务器会发送类似“接受”的内容。或者被拒绝&#39;相应

答案 2 :(得分:-1)

我知道这是回答的很晚了,但是我认为这会帮助很多人。 您可以通过以下代码检查现有的套接字(如果有)。

SocketAddress socketAddress = new InetSocketAddress("localhost", 8091);
    Socket socket = new Socket();
    ServerSocket serverSocket = null;
    try {
        socket.connect(socketAddress);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(socket == null) {
        try {
            serverSocket = new ServerSocket(8091);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

如果在同一端口和IP上未找到活动套接字,则它将启动新的服务器套接字,或者您只能将其更改为启动套接字,否则可以连接到现有套接字。