使用bufferedReader.readLine()从我的Socket输入流中读取时,它抛出SocketException,指出“连接重置”

时间:2019-04-13 03:37:13

标签: java sockets

我正在创建两个套接字:一个客户端套接字和一个服务器套接字。

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类中打印“客户端连接”语句。但是,当它尝试使用语句String str = bufferedReader.readLine();从bufferedReader读取数据时,它将抛出SocketException,指出“连接重置”。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您的问题是您没有在客户端中关闭Socket,当远程Socket恶意关闭连接时通常会抛出“连接重置”,在这种情况下,您就不会这样做。 t呼叫Socket.close()。如果您会注意到它会起作用,但您可能想的很好,为什么能解决此问题?为什么不只给我数据,然后下一次读取告诉我Socket已经关闭,那就好了,但是既然您使用的是readLine(),它会一直读取直到收到\n或{{ 1}},或者给定的\rInputStream中返回的值小于零。它几乎一直在读取,直到收到一行为止(要声明为read之类的完整行,您是否只是在末尾添加System.out.println),并且仍然没有找到新行,如果您在邮件末尾添加\n会发现它也可以使用。

此外,请删除\n,您再也不会使用它。

总是关闭袜子

答案 1 :(得分:-2)

测试了您的代码,为我工作。

编辑错字并包含指向问题的合理信息的链接

重置的可能原因可能是套接字在发送数据之前已关闭。

java.net.SocketException: Connection reset