java.net.SocketException:从服务器套接字发生连接重置

时间:2018-03-20 04:04:29

标签: java sockets

public class NewClass {

ServerSocket myServerSocket;
boolean ServerOn = true;

public NewClass() {
    try {
        myServerSocket = new ServerSocket(8888);
    } catch (IOException ioe) {
        System.out.println("Could not create server socket on port 8888. Quitting.");
        System.exit(-1);
    }



    while (ServerOn) {
        try {
            Socket clientSocket = myServerSocket.accept();
            ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
            cliThread.start();
        } catch (IOException ioe) {
            System.out.println("Exception found on accept. Ignoring. Stack Trace :");
            ioe.printStackTrace();
        }
    }
    try {
        myServerSocket.close();
        System.out.println("Server Stopped");
    } catch (Exception ioe) {
        System.out.println("Error Found stopping server socket");
        System.exit(-1);
    }
}

public static void main(String[] args) {
    new NewClass();
}

class ClientServiceThread extends Thread {

    Socket myClientSocket;
    boolean m_bRunThread = true;

    public ClientServiceThread() {
        super();
    }

    ClientServiceThread(Socket s) {
        myClientSocket = s;
    }

    public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        System.out.println(
                "Accepted Client Address - " + myClientSocket.getInetAddress().getHostName());
        try {
            in = new BufferedReader(new InputStreamReader(myClientSocket.getInputStream()));
            out = new PrintWriter(new OutputStreamWriter(myClientSocket.getOutputStream()));

            while (m_bRunThread) {
                String clientCommand = in.readLine();
                if (clientCommand != null) {
                    System.out.println("Client Says :" + clientCommand);
                }

                if (!ServerOn) {
                    System.out.print("Server has already stopped");
                    out.println("Server has already stopped");
                    out.flush();
                    m_bRunThread = false;
                }
                if (clientCommand.equalsIgnoreCase("quit")) {
                    m_bRunThread = false;
                    System.out.print("Stopping client thread for client : ");
                } else if (clientCommand.equalsIgnoreCase("end")) {
                    m_bRunThread = false;
                    System.out.print("Stopping client thread for client : ");
                    ServerOn = false;
                } else {
                    out.println("Server Says : " + clientCommand);
                    out.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                out.close();
                myClientSocket.close();
                System.out.println("...Stopped");
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }

    }
}

客户代码

public class Client {
public static void main(String[] args) throws IOException {

    Socket s = new Socket(InetAddress.getLocalHost(), 8888);


    PrintWriter out =new PrintWriter(s.getOutputStream(), true);
    out.print("KKKKKKKKKKKKK \r\n");
    out.flush();
    out.close();



 }

上述代码的目的是创建服务器套接字和客户端套接字以在服务器和客户端之间传递数据。当客户端将数据发送到服务器.server时抓取消息并将其打印在屏幕上,但有以下异常。从 String clientCommand = in.readLine()中弹出;出现在服务器代码上的行。

 java.net.SocketException: Connection reset

1 个答案:

答案 0 :(得分:0)

您的代码无效。您的服务器代码依赖于正确实现协议的客户端,而该客户端并不是这样。坏习惯。需要防御性编码。如果clientCommand == null您必须退出此读取循环并关闭套接字。您当前的代码将尝试写入已关闭的连接,这将产生此异常...稍后。