SocketException: сброс соединения при попытке чтения из сокета в Java? - PullRequest
3 голосов
/ 22 ноября 2011

Возникли некоторые раздражающие проблемы с сокетами Java, мое приложение, похоже, выходит из строя на самом базовом уровне. Часть моего приложения требует написания имен файлов через TCP-соединение. Код получателя выглядит следующим образом:

ServerSocket serverSocket = new ServerSocket(4445); 
Socket socket = serverSocket.accept();      
BufferedReader reader = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
String filename = reader.readLine();

Пока мой код отправителя выглядит следующим образом:

    Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
    PrintWriter writer = new PrintWriter(socket.getOutputStream());
    writer.write("Test.jpg");

Очень, очень простые вещи, но по какой-то причине я получаю SocketException: сброс соединения при запуске этого? Это полная трассировка стека:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at FileReceiver.main(FileReceiver.java:11)

со строкой FileReceiver.java:11, в которой выполняется вызов reader.readLine(). Я не могу понять, что происходит, так же как базовое использование сокетов TCP всегда работало для меня в прошлом, почему это происходит сейчас?

Ответы [ 6 ]

3 голосов
/ 22 ноября 2011

Ваш код работает отлично для меня ... Вы забыли добавить

    writer.close();
    socket.close();

вашему писателю?

3 голосов
/ 22 ноября 2011

Получатель ожидает окончания строки, которую ваш отправитель никогда не отправляет.Попробуйте что-то вроде println() на отправляющей стороне.

2 голосов
/ 22 ноября 2011

Вам нужно объединить слова Ника и Николая: вам нужно писать с помощью println (так как readLine ожидает конец строки), и вам нужно очистить ваш писатель перед закрытием.

 Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
 PrintWriter writer = new PrintWriter(socket.getOutputStream());
 writer.println("Test.jpg");
 writer.flush();
1 голос
/ 22 ноября 2011

Я бы посоветовал очистить ваш писатель перед тем, как вы попытаетесь прочитать, есть вероятность, что данные никогда не будут отправлены, прежде чем вы попытаетесь их прочитать.

0 голосов
/ 02 апреля 2014

Крис прав. Когда вы пишете usint PrintWriter или даже для сериализации как ObjectOutputStream (ObjectOutputStream oos = new ObjectOutputStream (socket.getOutputStream ());) вам необходимо вызвать функцию .flush (), и после этого вы должны закрыть Писатель и розетка. Ваше решение ниже:

 Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
 PrintWriter writer = new PrintWriter(socket.getOutputStream());
 writer.println("Test.jpg");
 writer.flush();
 writer.close();
 socket.close();

Ниже приведен пример для сериализации: (отправить объект по сети или сохранить его в файл в исходном состоянии для последующей репликации)

    ...
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(record);
oos.flush();
oos.close();
socket.close();
0 голосов
/ 22 ноября 2011

Это потому, что ваш сервер выходит. Используйте цикл while для отправки. Смотрите это . Здесь происходит то, что перед тем, как данные извлекаются на стороне клиента, серверная программа закрывается, так что соединение сбрасывается, и вы видите исключение, которое выдается на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...