【问题标题】:Java Socket Multithreading Server; ChattingJava Socket 多线程服务器;聊天
【发布时间】:2014-01-22 04:44:03
【问题描述】:

Server.java:

private Socket connection;
  private int ID;

  public static void main(String[] args) {
  int port = 19999;
  int count = 0;
    try{
      ServerSocket socket1 = new ServerSocket(port);

      System.out.println("Server Initialized");
      while (true) {
        Socket connection = socket1.accept();
        Runnable runnable = new Server(connection, ++count);
        Thread thread = new Thread(runnable);
        thread.start();
      }
    }
    catch (Exception e) {}
  }
Server(Socket s, int i) {
  this.connection = s;
  this.ID = i;//could use a client name as it is individual id for each thread.?
}
public void run() {
    try {
      BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      PrintWriter out = new PrintWriter(connection.getOutputStream(), true);

       String inputLine;
            while ((inputLine = in.readLine()) != null) {
                Process p = new Process();
                String output = p.input(inputLine);
                out.println(output);
                }
            }
    }
    catch (Exception e) {
      System.out.println(e);
    }
    finally {
      try {
        connection.close();
     }
      catch (IOException e){}
    }
}
}

在运行时它会创建一个服务器,当客户端连接到该服务器时,它会为其创建一个线程,以便它可以同时处理多个客户端。

但是代码:

while ((inputLine = in.readLine()) != null) {
                    Process p = new Process();
                    String output = p.input(inputLine);
                    out.println(output);
                    }

循环 BufferedReader 以获取客户端提供的所有输入。当接收到时处理它,然后将回复发送回客户端进行打印。

我怎样才能得到它,以便我可以在第一个问题的同时通过客户端发送/获取另一个问题?

例如

“用户:你好,计算机,你好吗?” “电脑:我很好,你好吗?” “用户:我很好” “计算机:很高兴听到”

工作正常。但是:

"用户:是 1+1?" “电脑:1+1=2” “电脑:还有问题吗?” “用户:好吗?”

没有。

如何做到这一点,以便服务器给出多个答案,而不必等待另一个输入?

如果我在 server.java 中将输出设置为字符串,这很容易做到,但是每次我尝试访问字符串来更改它时 (通过使用
Server s = new Server(); s.output = "stuff";)正如代码所示,它只是创建了一个新的线程服务器。如何访问已经创建的线程?

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

    您必须将客户端线程存储到一种映射中,如果您需要向另一个线程发送消息,您可以查找映射并获取对另一个线程的引用并从那里发送消息。

    【讨论】:

    • 似乎是个好主意,但在服务器类中访问地图会创建一个新线程
    • 不一定是新线程。您可以使用现有的客户端线程来访问地图。地图本身可以位于主服务器线程中。
    • 有很多方法可以做。一个例子(我并不是说这是最好的方法)是在服务器线程中使用 public static 修饰符创建一个哈希图。 hashmap 将在客户端 ID 和与之关联的客户端线程之间进行映射。
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多