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

Класс 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 с сообщением «сброс соединения». Как я могу исправить эту проблему?

0
DevLaka 13 Апр 2019 в 06:37

2 ответа

Лучший ответ

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

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

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

1
OughtToPrevail 13 Апр 2019 в 15:49

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

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

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

java.net.SocketException: сброс соединения

-2
simptri 13 Апр 2019 в 07:38