【问题标题】:Java Sockets: One Server and Multiple ClientsJava 套接字:一台服务器和多个客户端
【发布时间】:2013-09-06 02:56:59
【问题描述】:

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

  1. 客户端连接到服务器
  2. 服务器询问客户名称
  3. 客户端以名称响应
  4. 服务器迎接客户端
  5. 此后,客户端说话,服务器重复的话

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

【问题讨论】:

  • 这里没有多线程。
  • listener.accept() 之后的所有内容都需要位于扩展线程或实现可运行的不同类中。然后,您此时启动该线程,然后您的循环将接受下一个连接

标签: java multithreading sockets


【解决方案1】:

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

【讨论】:

  • @AlexeiKaigorodov 确实很容易误解,现在编辑了那个词。
【解决方案2】:

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

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

这是你需要做的:

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

或者:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多