我正在尝试编写简单的服务器 - 客户端聊天解决方案。出于测试目的,我正在创建一个包含2个serverThreads的数组,它们负责从连接的客户端发送和接收消息。
我希望服务器在连接的客户端数量达到最大值后拒绝连接。但是,即使服务器不接受连接,也会创建客户端上的套接字。方法socket.isBound和isConnected都返回true值。
回到主要问题。 您有什么想法,当ServerSocket无法连接时,我怎么能拒绝连接客户端.accept()附加连接?
这是Server类的代码。
System.out.println("Read line: "+nextline)
答案 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.isBound
和isConnected
都返回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上未找到活动套接字,则它将启动新的服务器套接字,或者您只能将其更改为启动套接字,否则可以连接到现有套接字。