Сокеты Java: один сервер и несколько клиентов

поэтому я создал базовую клиент-серверную программу на java. Все начинается так:--2-->

  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 Нить, но я столкнулся с еще большими проблемами там, поэтому я хочу попробовать и работать с этим в первую очередь.

2 ответов


входящие соединения обрабатываются только строки listener.accept();. Но после того, как вы подключили клиента, вы застряли в цикле while. Вам нужно создать новый Thread (или Runnable выполнены на ExecutorService Если вы ожидаете высокую нагрузку), и запустите его, то тут примите следующее соединение.


в двух словах, это то, что происходит не так.

  1. вы используете ровно один поток в качестве сервера.
  2. блокировка этого потока при вызове прослушивателя.accept ()

Это то, что вам нужно сделать:

создать два класса 1: сервер-аналогично тому, что у вас есть сейчас, но вместо того, чтобы выполнять фактическую работу в качестве Эхо-сервера, он просто порождает новый поток, который начинает прослушивать новый порт (который вы можете выбрать случайным образом), и отправляет клиенту адрес этого нового порта. Затем клиент получит новый номер порта и попытается подключиться к серверу на Новом Порту. 2: поток Echo-это запускает новый прослушиватель на переданном Порту и выполняет работу Эха для тех, кто слушает.

или:

вы запускаете UDP-сервер, а не TCP-сервер, и все это не имеет значения, но это выходит за рамки этого конкретного вопроса.