Клиент-Серверный чат работает только локально

129
27 ноября 2021, 09:30

Класс Сервера:

public class Server {
    public static final int PORT = 8008;
    private ServerSocket serverSocket;
    private Socket socket;
    public static ArrayList<Connection> clients = new ArrayList<>();
    public Server() throws IOException {
        serverSocket = new ServerSocket(PORT);
    }
    public void listen() throws IOException {
        while (true) {
            socket = serverSocket.accept();
            System.out.println("Someone connected");
            clients.add(new Connection(socket));
        }
    }
}

Класс, в котором общается клиент с сервером (серверный класс):

public class Connection extends Thread {
    private Socket socket;
    private BufferedWriter bw;
    private BufferedReader br;
    public Connection(Socket socket) throws IOException {
        this.socket = socket;
        bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        start();
    }
    @Override
    public void run() {
        String message;
        while (true) {
            try {
                message = br.readLine();
                System.out.println(message);
                for (Connection connection : Server.clients) {
                    connection.send(message);
                }
            } catch (IOException e) {
                leave();
            }
        }
    }
    public void send(String message) throws IOException {
        bw.write(message + "\n");
        bw.flush();
    }
    public void leave() {
        try {
            socket.close();
            br.close();
            bw.close();
            Server.clients.remove(this);
        } catch (IOException ignored) {}
    }
}
public Client(String ip, int port, String nick) throws IOException {
    this.nick = nick;
    this.socket = new Socket(ip, port);
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    new MessageReader().start();
    new MessageWriter().start();
}
private class MessageReader extends Thread {
    @Override
    public void run() {
        String message;
        while (true) {
            try {
                message = br.readLine();
                System.out.println(message);
            } catch (IOException ignored) {}
        }
    }
}
private class MessageWriter extends Thread {
    @Override
    public void run() {
        String message;
        while (true) {
            try {
                message = console.readLine();
                bw.write("[" + timeFormat.format(time) + "]" + nick + ": " + message + "\n");
                bw.flush();
            } catch (IOException ignored) {}
        }
    }
}

Main класс:

public class Main {
    public static void main(String[] args) throws IOException {
        if (args.length == 1) {
            new Server().listen();
        }
        else if (args.length == 4) {
            // - i ip -n nick
            new Client(args[args.length - 3], 8008, args[args.length - 1]);
        }
    }
}

Работает только в локальной сети. Пробовал отключать брандмауэр - безрезультатно.

READ ALSO
Не отображаются предметы в RecycleView

Не отображаются предметы в RecycleView

я новичок в Android StudioЯ делаю приложение заметочник, используя RecycleView и для сохранения заметок SQLite

101
LinkedHashMap что делает порядок доступа

LinkedHashMap что делает порядок доступа

У нас есть стандартный конструктор LinkedHashMap

133
Переменная из класса в jspx

Переменная из класса в jspx

Всем доброго дняСильно не пинайте, ибо не знаю, что ещё нужно выложить, чтобы решить проблему

98
Запрос разрешения на сохранение в съёмном хранилище Android Java

Запрос разрешения на сохранение в съёмном хранилище Android Java

Я хочу сделать возможность записи файлов на съёмный носительДело в том, что при попытки записи на него показывает ошибку open failed: EACCES (Permission...

81