Задать вопрос
@parkito

Как сделать многопоточный чат?

Здравствуйте. Помогите пожалуйста разобраться со следующей проблемой.
Пишу чат. Нужно сделать так, чтобы к серверу могли подключиться несколько клиентов. Взаимодействие с клиентами должно происходить в разных потоках.

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server implements Runnable {

    private final PrintStream writerToScreen = System.out;
    final ServerSocket serverSocket = new ServerSocket(9001);
    static List<Thread> list = new ArrayList<Thread>();
        public Server() throws IOException {
    }


    public static void main(String[] args) throws IOException {
        Thread thread = new Thread(new Server());
        thread.start();
    }


    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(9001);
            Socket clientSocket = serverSocket.accept();
            PrintWriter writerToClient = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader readerFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String line;
            while ((line = readerFromClient.readLine()) != null) {
                writerToScreen.println("recieved: " + line);
                writerToClient.println("I recieved your line [" + line + "]! sending back");
            }
            serverSocket.close();
            writerToClient.close();
            readerFromClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


Однако не могу решить проблему того, что
ServerSocket serverSocket = new ServerSocket(9001);

должен быть одним для всех объектов Server. Статическим его сделать не получается. Возможно многопоточность можно организовать другим образом,
  • Вопрос задан
  • 1032 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
у вас должен быть один основной поток, где вы ожидаете подключения. При подключении у вас создается сокет, который вы кидаете в отдельный тред.

Socket clientSocket = serverSocket.accept();

То есть у вас не верно логика работы построена. Вы при получении соединения начинаете сразу же с ним работтать, а вам нужно в цикле слушать новые соединения и для каждого запускать тред.

Хочу отдельно отметить, что при увеличении количества потоков производительность будет падать. При достижении отметки в пару сотен клиентов например. В этом случае лучше переключаться на event loop/микротреды/корутины.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект