我是java的新手,尤其是java网络,但我尝试做的是设置服务器(用于游戏)。当两个客户端连接到服务器时,我想拒绝任何其他连接。我可以关闭ServerSocket吗?如果ServerSocked关闭,那么作为线程运行并存储在集合中的那两个连接仍然存活并且能够与服务器进行通信?我希望你明白我的意思。
这是源代码:
//Server
public synchronized List<ClientThread> getClients(){
return clients;
}
public void run() {
try {
while(true){
Socket clsock = srvsock.accept();
if(getClients().size() == 2){
System.out.println("Too many connections!");
clsock.close();
continue;
}
ClientThread clt = new ClientThread(clsock);
clients.add(clt);
clt.start();
System.out.println("Connection accepted.");
}
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}
使用此代码,我无法在客户端上检测到连接是否仍处于活动状态,或者服务器是否已关闭连接。提前谢谢。
答案 0 :(得分:1)
测试客户端代码:
Socket s = new Socket("localhost", 8932);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
for (int i=0; i<20; i++) {
bw.write(String.valueOf(i));
bw.newLine();
bw.flush();
Thread.sleep(1000);
}
bw.close();
对于ClientThread:
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
while (true) {
String misc = in.readLine();
System.out.println(misc);
if (misc==null || misc.length()==0)
break;
}
in.close();
输出:
Connection accepted.
0
Connection accepted.
0
1
Too many connections!
1
2
2
3
所以它按照你的意图运作。顺便说一句,通常最好实现Runnable而不是扩展Thread - 参见"implements Runnable" vs. "extends Thread"
答案 1 :(得分:0)
每次建立连接时,服务器都会为下一个连接返回一个新套接字(当您使用srvsock.accept()时)。所以你可以关闭&#34; srvsock&#34;不影响&#34; clsock&#34;。要测试它们是否还活着,请查看此帖子How do I check if a Socket is currently connected in Java?。 希望你能解决问题。