6

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

  1. 客户端连接到服务器
  2. 服务器询问客户的名字
  3. 客户回复姓名
  4. 服务器迎接客户
  5. 在此之后,客户端说话,服务器重复这些话

使用本教程,我可以轻松完成这项工作。每当我尝试介绍多个客户时,问题就会出现。我认为它会起作用,因为我正在使用多个线程,但是,第二个客户端只是挂起,直到第一个客户端退出然后它开始工作(服务器确实接受来自第二个客户端的输入,但它没有响应直到第一个客户退出)。

这是我正在使用的代码:

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,但我在那里遇到了更多问题,所以我想先尝试使用它。

4

2 回答 2

4

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

于 2013-09-03T01:19:33.367 回答
3

简而言之,这就是问题所在。

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

这是你需要做的:

创建两个类 1:服务器 - 与您现在所拥有的类似,但它不做实际的回声服务器工作,它只是生成一个新线程,该线程开始在新端口(您可以随机选择)上侦听,并且向客户端发送此新端口的地址。然后客户端将获得新的端口号并尝试在新端口上连接到服务器。2:Echo 线程 - 这会在传递的端口上启动一个新的侦听器,并完成向正在侦听的人回显的工作。

或者:

您启动 UDP 服务器而不是 TCP 服务器,那么所有这些都无关紧要,但这超出了这个特定问题的范围。

于 2013-09-03T01:23:00.160 回答