Ответы Mail.ru: Java сетевое программирование

Проблема, с которой вы сталкиваетесь, вероятно, связана с тем, что вы используете `readLine()` для чтения данных на стороне клиента. `readLine()` читает строки до символа новой строки (`\n`), поэтому если в вашем сообщении содержатся строки без этого символа, `readLine()` будет ждать, пока он не встретит `\n`, что может привести к блокировке.

Вот несколько вариантов, как можно решить эту проблему:

1. **Используйте другой метод чтения данных на клиенте:** Вместо `readLine()`, который ждет символ новой строки, вы можете использовать `read()` или `read(byte[])`, чтобы читать данные порциями без ожидания символа новой строки. Это позволит вам прочитать данные до конца.

2. **Используйте фиксированную длину сообщения:** Если вы знаете фиксированную длину сообщения, которую вы отправляете с сервера, вы можете прочитать эту длину данных на клиенте и затем обработать данные соответственно.

3. **Используйте специальный разделитель:** Как вы уже пробовали, вы можете добавить специальный разделитель в конец каждого сообщения (например, вашего "stop") и читать данные до того момента, пока вы не встретите этот разделитель на стороне клиента.

Пример кода для чтения данных на стороне клиента с использованием `read()`:

```java

public static String listenForMessage() {

StringBuilder serverMessageBuilder = new StringBuilder();

char[] buffer = new char[1024]; // Размер буфера для чтения данных

try {

if (socket.isConnected()) {

InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());

int bytesRead;

// Читаем данные порциями в буфер

while ((bytesRead =

inputStreamReader.read

(buffer)) != -1) {

// Добавляем прочитанные данные к общему сообщению

serverMessageBuilder.append(buffer, 0, bytesRead);

}

}

} catch (IOException e) {

System.out.println("IOEXCEPTION");

throw new RuntimeException(e);

}

String serverMessage = serverMessageBuilder.toString();

System.out.println(serverMessage);

return serverMessage;

}

```

Этот код будет читать данные порциями в буфер и добавлять их к общему сообщению, пока данные не будут полностью прочитаны.