2015-02-06 72 views
0

我是新来的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); 
    } 
} 

有了这个代码,我不能在客户机上检测是否连接还活着,或者服务器已关闭了连接。提前致谢。

+0

我认为它会按照您描述的方式工作,但是您是否测试了它?让您的ClientThread使用BufferedReader从套接字的输入流中读取数据,并在读取每行时输出。然后编写一个测试客户端,用每行之间的Thread.sleep逐行写入输出流。运行测试客户端的三个实例,并且如果(在服务器输出流中)看到“其他两个客户端的输出”消息后显示“太多连接”消息,则表明它正在按照您的要求工作。 – 2015-02-06 14:38:44

+0

谢谢@PaulMedcraft,我会试试看。 – marthin23 2015-02-06 14:48:20

回答

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通常更好,而不是延长线程 - 请参阅"implements Runnable" vs. "extends Thread"

+0

就是这样。谢谢。 – marthin23 2015-02-06 15:51:07

+0

不用担心。而不是关闭ServerSocket,你可以改变while(clients.size()<2)while(true) – 2015-02-06 16:16:58

+0

我想问你一个问题。我正在使用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

0

每次建立连接时,服务器都会返回一个新套接字(当您使用srvsock.accept())进行下一次连接时。所以你可以关闭“srvsock”而不影响“clsock”。要测试他们是否还活着,请查看这篇文章How do I check if a Socket is currently connected in Java?。 希望你能解决你的问题。

+0

我对此一无所知。非常感谢。 – marthin23 2015-02-06 14:47:51

+0

我试图在达到两个连接后打破循环,关闭srvsock并引发异常: 关闭服务器。 //在srvsock.close()之后输出; java.net.SocketException:套接字已关闭 \t at java.net.SocketInputStream.socketRead0(Native Method)... – marthin23 2015-02-06 15:02:18

+0

您可以粘贴从套接字读取的代码吗?推测这是在ClientThread内? – 2015-02-06 15:20:21