Проблема, с которой вы сталкиваетесь, вероятно, связана с тем, что вы используете `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;
}
```
Этот код будет читать данные порциями в буфер и добавлять их к общему сообщению, пока данные не будут полностью прочитаны.
К делу, мне необходимо в цикле отправить большой кусок данных, а именно, тип String, в котором данные размещены примерно так "hello world\nyes\no\nno problem\n" и так далее.
Очень большая строка состоящая из символов пробела и новой строки.
Изначально я пробовал это все отправлять построчно, но после подумал к каждой строке на конец прибавлять \n и вот таким образом все за раз отправить но ничего не помогло.
Проблема в том, что клиент не может адекватно прочесть всю информацию. Он либо её не читает, либо читает не до конца (то есть не всю информацию), то либо читает всю эту информацию с дубликатами этой информации, то есть некоторые куски встречаются по 5-10 раз.
Я не понимаю, как правильно отправлять такие большие куски данных и правильно их обрабатывать, чтобы не было потерь или дублирующийся информации. Зачастую клиент оказывается в такой ситуации: он все прочел, но каким-то образом все равно оказался на строке, где необходимо читать ввод с сервера и это блокирующая операции, то есть программа клиента зависает. Я также пробовал на конец строки, отправляемой сервером, прибавлять "завершающее слово" типа "stop" или что-то такое, но это тоже не помогло, потому что клиент читает информацию неравномерно, он почему-то может за один раз прочесть половину всех строк, а не каждую по отдельности или вообще непонятно как прочесть.
Код сервера:
*сервер правильно формирует пласт информации и по идее правильно ее отправляет*
Код клиента: