Java套接字:一个服务器和多个客户端

时间:2013-09-03 01:16:11

标签: java multithreading sockets

所以我在java中创建了一个基本的客户端 - 服务器程序。它开头是这样的:

  1. 客户端连接到服务器
  2. 服务器要求客户名称
  3. 客户回复姓名
  4. 服务器迎接客户
  5. 此后,客户端发言,服务器重复“
  6. ”字样

    我使用this tutorial毫不费力地使用它。每当我尝试引入多个客户端时,问题就出现了。我认为它会工作,因为我使用多个线程,但是,第二个客户端只是挂起,直到第一个客户端退出然后它启动它工作(服务器确实接受来自第二个客户端的输入,但它不响应任何东西,直到第一个客户退出)。

    以下是我正在使用的代码:

    import java.net.*;
    import java.io.*;
    
    public class Server extends Thread {
      private ServerSocket listener;
    
      public Server(int port) throws IOException {
        listener = new ServerSocket(port);
      }
    
      public void run() {
        while(true) {
          try {
            Socket server = listener.accept();
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("What is your name?");
            DataInputStream in = new DataInputStream(server.getInputStream());
            String user_name = in.readUTF();
            out.writeUTF("Hello "+user_name);
            while(true) {
              String client_message = in.readUTF();
              out.writeUTF(client_message);
            }
          }
          catch(IOException e) {
            e.printStackTrace();
          }
        }
      }
    
      public static void main(String[] args) {
        int port = 6006;
        try {
          Thread t = new Server(port);
          t.start();
        } catch(IOException e) {
          e.printStackTrace();
        }
      }
    }
    

    有人可以解释我做错了吗?

    我已经看过使用Runnable而不是Extends Thread,但是我遇到了更多的问题,所以我想先尝试使用它。

2 个答案:

答案 0 :(得分:4)

传入连接仅由行listener.accept();处理。但是在你连接了一个客户端后,你就陷入了while循环。您需要创建一个新的Thread(或RunnableExecutorService上执行,如果您期望高负载),并启动它,然后立即接受下一个连接

答案 1 :(得分:3)

简而言之,这就是出了问题。

  1. 您正在使用一个线程作为服务器。
  2. 在调用listener.accept()
  3. 时阻止此线程

    这是你需要做的:

    创建两个类 1:服务器 - 类似于你现在拥有的,但它不是做一个充当回声服务器的实际工作,它只是产生一个新的线程,它开始在一个新的端口上监听(你可以随机选择),并发送客户端这个新端口的地址。然后,客户端将获取新的端口号,并尝试连接到新端口上的服务器。 2:Echo线程 - 这会在传递的端口上启动一个新的侦听器,并且可以回应那些正在侦听的人。

    OR:

    启动UDP服务器而不是TCP服务器,所有这些都无关紧要,但这不属于这个特定问题的范围。