Java - печать на несколько выходов с сокетом - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь создать многопоточный чат, к которому могут присоединиться несколько человек.Цель состоит в том, чтобы, когда один человек отправлял сообщение, оно печаталось на экране всех остальных.Вот код сервера:

package edu.fcps.ab;
import java.io.*;
import java.net.*;
import java.util.*;

public class TestServer implements Runnable{
    private int port;
    public static ServerSocket serverSock;
    public static Vector<PrintWriter> outputs = new Vector<PrintWriter>();
    public PrintWriter output;
    public BufferedReader input;
    public TestServer(int p) {
        port = p;
    }
    public static void main (String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter port number");
        int port = scan.nextInt();
        TestServer ts = new TestServer(port);
        Thread t = new Thread(ts);
        t.start();
    }

    @Override
    public void run() {
        try {
            if(serverSock == null)
                 serverSock = new ServerSocket(port);
            Socket sock = serverSock.accept();
            TestServer ts = new TestServer(port);
            Thread t = new Thread(ts);
            t.start();
            output = new PrintWriter(sock.getOutputStream(), false);
            outputs.add(output);
            input = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            while(t.isAlive()) {
                String message = input.readLine();
                if(message != null) {
                    System.out.println(message);
                    for(PrintWriter w : outputs) {
                        w.println(message);
                        w.flush();
                    }
                }
            }
        } catch(Exception e) {
            System.out.println("An error occurred");
            e.printStackTrace();
        }

    }

    public PrintWriter getOutput() {
        return output;
    }
}

Вот код клиента:

package edu.fcps.ab;
import java.io.*;
import java.net.*;
import java.util.*;
public class TestClient implements Runnable{
    private String username;
    public PrintWriter out;
    public static void main (String args[]) {
        TestClient tc = new TestClient();
        Thread t = new Thread(tc);
        t.start();
    }

    @Override
    public void run() {
        Scanner s = new Scanner(System.in);
        System.out.println("Enter port");
        int port = s.nextInt();
        String ip = "127.0.0.1";
        try {
            Socket sock = new Socket(ip, port);
            System.out.println("Successfully connected");
            System.out.println("Enter username");
            username = s.next();
            System.out.println("Welcome " + username);
            out = new PrintWriter(sock.getOutputStream(), true);
            out.println(username + " connected");
            InputStream stream = sock.getInputStream();
            Scanner input = new Scanner(stream);
            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
            String sent;
            while(true) {
                if(stream.available() > 0) {
                    if(input.hasNextLine()) {
                        String message = input.nextLine();
                        String[] split = message.split(" ");
                        if(!(split[0].contains(username)))
                            System.out.println(message);
                    } 
                }
                sent = stdin.readLine();
                if(sent != null) {
                    out.println(username + ": " + sent);
                }
            }
        } catch(Exception e) {
            out.println(username + " disconnected");
        }
    }
}

В настоящее время к нему могут присоединиться несколько человек, и он распечатывает все сообщения на стороне сервера, носообщения не распечатываются на всех клиентах.Почему это происходит?

1 Ответ

1 голос
/ 11 июня 2019

… но сообщения распечатываются не на всех клиентах. Почему это происходит?

Это происходит потому, что все клиенты вызывают stdin.readLine() и блокируются там до тех пор, пока не станет доступной строка ввода; после этого они продолжают цикл while(true) и печатают до одного сообщения, прежде чем снова блокируют в stdin.readLine().

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