Java: не может читать из сокета, поток застревает в readLine () - PullRequest
0 голосов
/ 24 мая 2018

Вот мой код для серверной стороны:

@Override
public void run(){
    String message;
    String command;
    String[] arguments;

    try{
        BufferedReader inStream = new BufferedReader(
                                    new InputStreamReader(
                                        clientSocket.getInputStream()));

        while(online){
            message = inStream.readLine();

            if(message == null)
                continue;

            if(message.charAt(0) == '/'){
                int endOfCommandIndex = message.indexOf(' ');
                command = message.substring(1, endOfCommandIndex);
                arguments = message.substring(endOfCommandIndex + 1).split(" ");

                if(command.equals("login")){
                    setUserName(arguments[0]);
                    setName(arguments[0]);

                    sendMessage(this, "Connected");
                }
                //....
          }
     }
}

Как упоминалось в заголовке, поток застревает при чтении из InputStream сокета (я проверил с помощью JDB, и это не условное ожидание, потому чтокажется, он все еще "работает").

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

Для клиентской стороны:

String msg;
try{
    while(!((msg = stdIn.readLine()).equals("/quit")))
        toServer.println(msg);
}
catch(IOException e){
    e.printStackTrace();
}

Если кто-то захочет просмотреть весь мой код, здесь он размещен на github

1 Ответ

0 голосов
/ 24 мая 2018

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

Попробуйте либо вызвать:

toServer.flush();

после println, либо включить автоматическую очистку при построении toServer:

toServer = new PrintWriter(socket.getOutputStream(), true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...