@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. Статическим его сделать не получается. Возможно многопоточность можно организовать другим образом,
  • Вопрос задан
  • 1017 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
у вас должен быть один основной поток, где вы ожидаете подключения. При подключении у вас создается сокет, который вы кидаете в отдельный тред.

Socket clientSocket = serverSocket.accept();

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

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

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
25 апр. 2024, в 19:22
18000 руб./за проект
25 апр. 2024, в 19:21
10000 руб./за проект
25 апр. 2024, в 18:47
2795100 руб./за проект