0

好的,所以我的一个朋友正在教我有关 java 的网络知识,我们有一个成功的程序。这是一个简单的聊天,我们用 putty 连接,但我们有一个问题。一次只能连接一个客户端。有人可以说如何一次连接更多客户端以及如何限制连接的客户端数量吗?

public class Base 
{
  static ServerSocket serverSocket;
  public static void main(String[] args) throws IOException
  {
    final ServerSocket serverSocket = new ServerSocket (1337);
    Thread thread = new Thread(new Runnable()
                                 {
      public void run()
      {
        try
        {
          System.out.println("Waiting for connections...");
          //Make Socket on port
          Socket client = serverSocket.accept();
          System.out.println("Connection from " + client.getInetAddress());
          //initialixe no socket with connect server gets
          BufferedReader in = new BufferedReader (new InputStreamReader(client.getInputStream()));
          //init new beffer to read incom
          //while loop to read stuff
          final BufferedWriter out = new BufferedWriter(new PrintWriter(client.getOutputStream()));
          out.write("Your Connected Mate");
          out.newLine();
          out.flush();
          new Thread(new Runnable()
                       {
            public void run()
            {
              try
              {
                Scanner s = new Scanner(System.in);
                while(s.hasNext())
                {
                  out.write("CLIENT] " + s.nextLine());
                  out.newLine();
                  out.flush();
                }
              }
              catch(Exception e)
              {
                e.printStackTrace();
              }
            }
          }).start();
          while(true)
          {
            //make a string form anything thats read from the socket
            String tmp = in.readLine();
            //if the string isnt null (which it is if we disconnect) print it out
            if(tmp != null)
            {
              System.out.println("[CLIENT -> SERVER] " + tmp);
            }
          }
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
      }
    });
    thread.run();
  }
}

我们没有尝试过任何事情,因为我们不知道:)

4

2 回答 2

0

我相信您需要围绕接受客户端中的连接(在现有线程内)放置一个while(true)循环(或或其他东西)。如果您要让连接长时间保持活动状态,我想您会想要生成处理它们的线程(简单的 Web 服务器等用例可能不需要生成线程 - 时间量每个客户端占用的资源可能少于生成线程所占用的资源)。while(notInterrupted)run

尝试四处寻找一些示例服务器,看看是否可以根据需要调整它们。

至于限制能够连接的客户端数量,您可能需要某种阻塞数据结构来处理线程池,并且只有在一个线程被释放时才给您一个。想到一个线程池......

于 2013-01-30T23:49:24.130 回答
0

将第一个语句中的所有内容包围try在一个 while 循环中,只要您希望连接另一个客户端,该循环就会不断重复。然后,您需要将输入代码(如in.readLine()代码)放入它自己的线程中,就像您为服务器的输出(out.write()).

每个客户端都需要自己的输入线程和输出线程。尽量保持客户端和服务器之间的通信脱离主线程,以便服务器可以继续接受连接。

示例代码:

//Setup your ServerSocket

ServerSocket server = new ServerSocket();

while (true){
    Socket s = server.accept();
    Thread input = new Thread(new Runnable(){
            //Set up your BufferedReader or whatever input method you are using here
                      BufferedReader in = new BufferedReader (new InputStreamReader(client.getInputStream()));

            while(true)
            {
            //make a string form anything thats read from the socket
            String tmp = in.readLine();
            //if the string isnt null (which it is if we disconnect) print it out
            if(tmp != null)
            {
              System.out.println("[CLIENT -> SERVER] " + tmp);
            }
          }
        }).start();

    //Do the same for your output as you just did for your input (make a new thread, make a new writer object, etc.)
}
}

注意:这是一个非常粗略的例子。您需要填写一些空白,也许还有一些 {} 希望这会有所帮助!

于 2013-01-30T23:49:57.660 回答