Сокеты Java: один сервер и несколько клиентов
поэтому я создал базовую клиент-серверную программу на java. Все начинается так:--2-->
- клиент подключается к серверу
- сервер запрашивает имя
- клиент отвечает с именем
- сервер приветствует клиента
- после этого клиент говорит и сервер повторяет слова обратно
Я получил это, чтобы работать без особых проблем с использованием в этом уроке. Проблема приходит, когда я пытаюсь представьте несколько клиентов. Я думал, что это сработает, потому что я использую несколько потоков, однако, вторые клиенты просто зависают, пока первый клиент не завершит работу, а затем он начнет работать (сервер принимает ввод от второго клиента, но он ничего не отвечает, пока первый клиент не завершит работу).
вот код, который я использую:
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
Если вы ожидаете высокую нагрузку), и запустите его, то тут примите следующее соединение.
в двух словах, это то, что происходит не так.
- вы используете ровно один поток в качестве сервера.
- блокировка этого потока при вызове прослушивателя.accept ()
Это то, что вам нужно сделать:
создать два класса 1: сервер-аналогично тому, что у вас есть сейчас, но вместо того, чтобы выполнять фактическую работу в качестве Эхо-сервера, он просто порождает новый поток, который начинает прослушивать новый порт (который вы можете выбрать случайным образом), и отправляет клиенту адрес этого нового порта. Затем клиент получит новый номер порта и попытается подключиться к серверу на Новом Порту. 2: поток Echo-это запускает новый прослушиватель на переданном Порту и выполняет работу Эха для тех, кто слушает.
или:
вы запускаете UDP-сервер, а не TCP-сервер, и все это не имеет значения, но это выходит за рамки этого конкретного вопроса.