readLine () из DataInputStream не получает данные правильно - PullRequest
0 голосов
/ 07 января 2019

Я новичок в области манипуляций с сокетом, в настоящее время я использую свой Java-клиент для связи с моим C-сервером, и у меня возникла небольшая проблема с чтением данных с моего сервера.

Когда я запускаю свой сервер, он корректно возвращает все данные (я отправляю запрос SQL от моего клиента Java, но всякий раз, когда я пытаюсь прочитать его с моего клиента с помощью DataInputStream.

Я в основном пытаюсь отобразить имена пользователей в правой части моего приложения, когда я запускаю его, отправляя SQL-запрос на сервер «ВЫБЕРИТЕ имя пользователя ОТ имени пользователя, ГДЕ состояние =« онлайн »», сервер C отправляет ответ с : «Aoisuki AntoineLg "

Когда я пытаюсь прочитать данные с помощью readLine (); в цикле while отображается только имя пользователя "Aoisuki".

Я не думаю, что нужно показывать вам код моего C-сервера, потому что я уже пробовал с клиентом C, и все работало хорошо.

Итак, вот мой код Java от клиента:

public String recvMsg() throws IOException {
    s = new Socket(addr,port);
    din = new DataInputStream(s.getInputStream());
    d = new BufferedReader(new InputStreamReader(din));
    StringBuilder result = new StringBuilder();
    String tmp = "";
    try {
        while(((tmp=d.readLine())!=null)){
            result.append(tmp);
            d.wait();
        }
    } catch(Exception e){
       ....
    }
    return result.toString();
}

Я уже пытался поместить "d.wait ()" после цикла while, но у меня возникла другая проблема: мой Клиент не запускался, пока сервер не был закрыт, но у меня отображались оба имени пользователя (это то, что я хотите)

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 07 января 2019

Метод wait является частью каждого объекта Java. Это одна из трех отдельных вещей, которые работают вместе: метод wait, метод notify и ключевое слово synchronized.

Вы не должны называть это здесь; нет причин когда-либо вызывать его на буферизованном считывателе, и вам не следует вызывать его здесь. d.readLine() заблокирует; Вы можете просто удалить эту строку.

...