Java有限连接到服务器
我是新来的java和尤其是java网络,但我想要做的是建立一个服务器(游戏)。当两个客户端连接到服务器时,我想拒绝任何其他连接。我能关闭ServerSocket吗?如果ServerSocked已关闭,那么已经作为线程运行并存储在集合中的那两个连接仍然活着,并且能够与服务器通信?我希望你明白我的观点。Java有限连接到服务器
这里的源代码:
//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);
}
}
有了这个代码,我不能在客户机上检测是否连接还活着,或者服务器已关闭了连接。提前致谢。
代码的测试客户端:
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通常更好,而不是延长线程 - 请参阅"implements Runnable" vs. "extends Thread"
就是这样。谢谢。 – marthin23 2015-02-06 15:51:07
不用担心。而不是关闭ServerSocket,你可以改变while(clients.size() 2015-02-06 16:16:58
我想问你一个问题。我正在使用GUI进行应用程序。当用户按下create按钮时,它将以这种方式创建一个线程(我的GUI类扩展JFrame实现了Runnable):Thread t1 = new Thread(this); t1.start();在run()方法中,它创建服务器的实例...在创建服务器之后,将同一用户创建为客户端是否是一个好主意?在t1.start()之后;我这样做︰Client cl = new Client(“localhost”); – marthin23 2015-02-06 16:39:52
每次建立连接时,服务器都会返回一个新套接字(当您使用srvsock.accept())进行下一次连接时。所以你可以关闭“srvsock”而不影响“clsock”。要测试他们是否还活着,请查看这篇文章How do I check if a Socket is currently connected in Java?。 希望你能解决你的问题。
我对此一无所知。非常感谢。 – marthin23 2015-02-06 14:47:51
我试图在达到两个连接后打破循环,关闭srvsock并引发异常: 关闭服务器。 //在srvsock.close()之后输出; java.net.SocketException:套接字已关闭 \t at java.net.SocketInputStream.socketRead0(Native Method)... – marthin23 2015-02-06 15:02:18
您可以粘贴从套接字读取的代码吗?推测这是在ClientThread内? – 2015-02-06 15:20:21
我认为它会按照您描述的方式工作,但是您是否测试了它?让您的ClientThread使用BufferedReader从套接字的输入流中读取数据,并在读取每行时输出。然后编写一个测试客户端,用每行之间的Thread.sleep逐行写入输出流。运行测试客户端的三个实例,并且如果(在服务器输出流中)看到“其他两个客户端的输出”消息后显示“太多连接”消息,则表明它正在按照您的要求工作。 – 2015-02-06 14:38:44
谢谢@PaulMedcraft,我会试试看。 – marthin23 2015-02-06 14:48:20