Java - клиенты не будут получать данные с сервера, несмотря на то, что сервер получает данные от клиентов - PullRequest
1 голос
/ 21 мая 2019

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

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

Я прочитал множество кода и предложений как с StackOverflow, так и с других форумов, но, похоже, не могу найти проблему.

ServerThread имеет PrintWriter "out", объявленный и захваченный как таковой:

private PrintWriter out;

public PrintWriter getWriter(){
        return out;
    }

public void run() {
        try{
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader (new InputStreamReader(socket.getInputStream()));

Этот метод в ServerThread должен передавать данные вместе:

if(input != null){
                    //Loggs message to file:
                    loggMessage(input);
                    //Loggs message to Server GUI
                    setOutput(input);
                    //Prints message to Output
                    System.out.println(input);
                    //Sends message to other clients:
                    for(ServerThread c : UserList){
                        System.out.println("Client discovered");
                        PrintWriter clientwriter = c.getWriter();
                        clientwriter.write(input);
                        System.out.print(input + " <-- was written to client");
                    }
                }

Консоль (и файл) получают все сообщения, как и ожидалось, а клиенты - нет. Насколько я могу судить, это вызвано тем, что в этой партии кода что-то не так с этой строкой, или что-то не так на стороне клиента

на стороне клиента:

in = new BufferedReader (new InputStreamReader(socket.getInputStream()));

"in" объявляется так за несколько строк до следующего фрагмента кода:

if(in.ready()){
                    String serverin = in.readLine();
                    System.out.println(serverin);
                    setOutput(serverin);
                }

Этот system.out.print ничего не печатает. Это заставляет меня верить, что что-то не так уже в if, но я не уверен, что это будет.

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

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

"clientwriter.write (вход)" должен был быть "clientwriter.println (вход)". После изменения вся система работала так, как задумано.

0 голосов
/ 21 мая 2019

Я думаю, что этот вызов in.ready () неправильный.

if(in.ready()){
                    String serverin = in.readLine();
                    System.out.println(serverin);
                    setOutput(serverin);
                }

Нет необходимости вызывать ready (), потому что in.readline () будет ждать (блокировать), пока не будет введен ввод.

Другая проблема заключается в том, что readline () будет ожидать (блокировать), пока сервер не отправит новую строку, и вернет строку только после получения новой строки, так что вы уверены, что ввод содержит новую строку?

...