Как отправить сообщение всем клиентам на многопоточном сервере? - PullRequest
0 голосов
/ 14 февраля 2019

Я написал простой многопоточный Сервер, на котором два Клиента могут отправлять Сообщения на Сервер, а Сервер - Сообщение всем Клиентам одновременно.Но я не могу заставить его работать как задумано.

Я уже попробовал это, поместив Список всех PrintWriter в класс Server, а затем распечатал Сообщение через каждый PrintWriter, но это тоже не сработало.

открытый класс Client {

private static final String IP = "10.59.0.188";

private Socket clientSocket;
private PrintWriter toServer;
private BufferedReader fromServer;
private BufferedReader input;
private String serverMessage;
private String clientMessage;
private String name;

public static void main(String[] args) {
    try {
        new Client();
    } catch (Exception e) {
        System.err.println(e);
    }
}

public Client() throws IOException {
    input = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Name: ");
    name = input.readLine();
    openConnection();
    toServer.println(name);

    while (true) {
        clientMessage = input.readLine();
        toServer.println(clientMessage);
    }

    //closeConnection();
}

private void openConnection() throws IOException{
    clientSocket = new Socket(IP, 6666);
    toServer = new PrintWriter(clientSocket.getOutputStream(), true);
    fromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}

}

открытый класс Server {

private ServerSocket serverSocket;
private BufferedReader input;
private Vector<ClientProcess> processList;
private int clientCount = 0;
private String serverMessage;

public static void main(String[] args) {
    try {
        new Server();
    } catch (Exception e) {
        System.err.println(e);
    }
}

public Server() throws IOException {
    startServer();

    while (clientCount < 2) {
        waitForNewClient();
    }

    for (ClientProcess clientProcess : processList) {
        clientProcess.start();
        System.out.println("Clientprocess started");
    }        
}

private void startServer() throws IOException {
    processList = new Vector<>();
    input = new BufferedReader(new InputStreamReader(System.in));
    serverSocket = new ServerSocket(6666);
    System.out.println("Server online");
}

private void waitForNewClient() throws IOException {
    System.out.println("Waitin' for new Client...");
    Socket clientSocket = serverSocket.accept();
    ClientProcess clientProcess = new ClientProcess(clientSocket);
    processList.add(clientProcess);
    clientCount++;
}

}

открытый класс ClientProcess extends Thread {

private Socket clientSocket;
private PrintWriter toClient;
private BufferedReader fromClient;
private String clientMessage;
private String serverMessage;
private String name;
private BufferedReader input;

public ClientProcess(Socket clientSocket) {
    this.clientSocket = clientSocket;
    input = new BufferedReader(new InputStreamReader(System.in));
}

@Override
public void run() {
    try {
        openClientConnection();
        name = fromClient.readLine();

        do {
            clientMessage = fromClient.readLine();
            System.out.println(name + ": " + clientMessage);
        } while (true);

        //closeClientConnection();
    } catch (IOException e) {
        System.err.println(e);
    }
}

private void openClientConnection() throws IOException {
    toClient = new PrintWriter(clientSocket.getOutputStream());
    fromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    serverMessage = "ServerMessageTest00";
    toClient.println(serverMessage);
    System.out.println("Client Connection Online");
}

}

1 Ответ

0 голосов
/ 19 февраля 2019

В ClientProcess вы создаете новый PrintWriter.

Из javadoc:

Создает новый PrintWriter без автоматической очистки строки из существующего OutputStream.

Это означает, что ваш toClient.println(...); записан в выходной буфер сервера, но не будет отправлен клиенту, потому что вы пропустили toClient.flush().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...