При чтении из моего входного потока Socket с использованием bufferedReader.readLine (), он генерирует исключение SocketException, указывающее «сброс соединения» - PullRequest
0 голосов
/ 13 апреля 2019

Я создаю два сокета: сокет клиента и сокет сервера.

Класс ServerSock:

public class ServerSock {

    public static void main(String args[]) throws Exception{

        //creating welcome socket @param: port number
        System.out.println("Server is started...");
        ServerSocket serverSocket = new ServerSocket(55555);

        System.out.println("Server is wating for client request...");

        //creating individual sockets for clients
        Socket socket0 = serverSocket.accept();

        System.out.println("Client connected...");

        //reading the input data
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket0.getInputStream()));

        //reading the data from bufferedReader
        String str = bufferedReader.readLine();

        //console the data
        System.out.println(" client data : " + str);
    }
}

Класс ClientSocket:

public class ClientSocket {

    public static void main(String args[]) throws Exception{

        //ip address of the server
        String ip = "localhost";
        //port number of the application
        int port = 55555;

        //creating a socket
        Socket socket = new Socket(ip, port);

        //data to send
        String data0 = "lakshan waruna";

        //converting data to ByteStream param: where to send the data
        OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());

        //writing the data
        os.write(data0);
        os.flush();
    }
}

ServerSockработает, пока я не запускаю клиентский сокет.Он также печатает оператор «клиент подключен» в классе ServerSock.Но когда он пытается прочитать данные из bufferedReader, используя оператор String str = bufferedReader.readLine();, он выбрасывает SocketException с сообщением «сброс соединения».Как я могу исправить эту проблему?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Ваша проблема в том, что вы не закрываете Socket в клиенте, "Сброс соединения" обычно генерируется, когда удаленный Socket незаметно закрыл соединение, что имеет место в данном случае, так как вы не звоните Socket.close().Если вы это сделаете, вы заметите, что это сработает, но вы, вероятно, думаете хорошо, почему это исправляет?Почему бы просто не дать мне данные, тогда при следующем прочтении скажите, что Socket закрылся, что ж, да, но так как вы используете readLine(), который постоянно читает, пока не получит \n или \r или, если данный InputStream возвращает меньше нуля в read.В значительной степени он читает до тех пор, пока не получит полную строку (для объявления полной строки, например, System.out.println, вы просто добавляете \n в конце), и ему еще предстоит найти новую строку, если вы добавите \n в конце сообщения вы заметите, что оно также будет работать.

Кроме того, удалите PrintWriter, вы никогда его не используете.

ВСЕГДА ЗАКРЫВАЙТЕ РОЗЕТКУ .

0 голосов
/ 13 апреля 2019

Протестировал твой код, у меня сработал.

Отредактированная опечатка и включенная ссылка на правдоподобную информацию по вопросу

Возможные причины для подключения сброс может заключаться в том, что сокет закрыт перед отправкой данных.

java.net.SocketException: сброс подключения

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