Ввод-вывод из сокетов зависает

#java #sockets #java-stream

#java #сокеты #java-поток

Вопрос:

Итак, я пытаюсь передать некоторый текст между 2 машинами и иметь эти классы:

Одноранговый класс просто содержит сокет.

NetworkHelper:

 public class NetworkHelper
{
    private NetworkHelper() {}

    public static Socket writeLineToPeer(Peer peer, String message) throws IOException
    {
        Socket socket = peer.getSocket();
        
        PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
        
        writer.println(message);
        
        return socket;
    }
}
  
 public class ServerConnectionThread implements Callable<Void>
{
    private Peer peer;

    public ServerConnectionThread(Peer peer)
    {
        this.peer = peer;
    }

    @Override
    public Void call() throws InvalidMessageException, IOException
    {
        String message = "";

        BufferedReader reader = new BufferedReader(new InputStreamReader(this.peer.getSocket().getInputStream()));
            
        message = reader.readLine();
            
        System.out.println(message);
    }
}
  

Как только a ServerConnectionThread запускается с сервера (работает отлично), поток просто зависает reader.readLine() в call() методе.
Я пробовал использовать все виды потоков с разделителем строк (n), без разделителя строк, но все они либо застревают в методе чтения, либо продолжаются, ничего не читая (я уверен, что отправляю сообщение).

РЕДАКТИРОВАТЬ: клиент отправляет сообщение, просто написав:

 NetworkHelper.writerLineToPeer(peer, "Hello world");
  

РЕДАКТИРОВАТЬ 2: рукопожатие в порядке: https://pasteboard.co/JuxLX7c.png

Комментарии:

1. Вы уверены, что сообщение передано? Я бы посоветовал проверить с помощью Wireshark на принимающей стороне, чтобы убедиться, что соединение с сокетами (рукопожатие и т. Д.) Выполнено правильно.

2. Сокет должен быть подключен, поскольку, если я завершу программу с любой стороны, другая сторона получит сброс соединения. @SnowmanXL

3. @nos ‘true’ в конструкторе означает автоматическую очистку, в любом случае я уже пробовал, и это ни на что не влияет.

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

5. @Holger Теперь я попробовал использовать UTF-8 для обеих сторон и все равно ничего