#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 для обеих сторон и все равно ничего