面对Java中关闭客户端的异常

时间:2014-05-15 20:34:08

标签: java sockets tcp

我是java中socket编程的新手,所以面对一个问题似乎并不困难,但由于不熟悉而无法解决。以下是客户端和服务器的代码。

服务器代码:

public class connectionServer {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    String clientSentence;
    String capitalizedSentence;
    BufferedReader inFromClient;
    DataOutputStream outToClient;
    BufferedReader inFromUser;

    try {
        ServerSocket welcomeSocket = new ServerSocket(70);
        Socket connectionSocket;
        connectionSocket = welcomeSocket.accept();
        System.out.println("Connection accepted for " + connectionSocket.getInetAddress() + ": " + connectionSocket.getPort());
        InputStreamReader input = new InputStreamReader(connectionSocket.getInputStream());
        inFromClient = new BufferedReader(input);



        while (true) 
        {        

            if(input.ready())
            {
                clientSentence = inFromClient.readLine();                
                System.out.println(clientSentence);
            }

            String tempString = "FROM SERVER: What's problem......";

            try
            {
                Thread.currentThread().sleep(1000);
            }
            catch(Exception e)
            {
                System.out.println(e);
            }

            outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            if(outToClient != null)
            {
                outToClient.writeBytes(tempString + "\n");
                outToClient.flush(); 

            }
        }
    } 
    catch (IOException e) 
    {
        System.out.println(e);
        e.printStackTrace();
    }
}

}

客户代码:

public class connectionClient {

static Socket clientSocket = null;
//////////////////////////////////////////

//////////////////////////////////////////
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    String sentence;
    String modifiedSentence;
    attachShutDownHook();
    try
    {
        clientSocket = new Socket("127.0.0.1", 70);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());;
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        outToServer.writeBytes("FROM CLIENT 2: Hello \n\n");

        while(clientSocket.isConnected())
        {               

            sentence = "Please reply me....";
            try
            {
                Thread.currentThread().sleep(1000);
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
            if(inFromServer.ready())
            {
                modifiedSentence = inFromServer.readLine();
                System.out.println(modifiedSentence);
            }
            outToServer.writeBytes("FROM CLIENT 2:" + sentence + "\n");
            outToServer.flush();
        }

    }
    catch(IOException e)
    {
        System.out.println(e);
    }
    finally
    {
        System.exit (0) ;
    }
}

}

当我停止客户端后,在服务器端抛出异常

    java.net.SocketException: Connection reset by peer: socket write error
    java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:132)
at java.io.DataOutputStream.writeBytes(DataOutputStream.java:276)
at connectionserver.connectionServer.main(connectionServer.java:57)

在这方面的任何帮助将受到高度赞赏。感谢

1 个答案:

答案 0 :(得分:0)

这通常意味着您已写入已由对等方关闭的连接。换句话说,应用程序协议错误。

您的代码需要工作。

  1. 不要使用ready():只需阻塞read()直到数据到达。目前,当ready()返回false时,你正在吸烟。这可能导致错误。

  2. 连接套接字后,
  3. isConnected()始终为true。当同伴关闭他的结束时,它不会神奇地返回虚假。您必须通过EOS或异常检测到。循环播放while(isConnnected())并不有效。

  4. 不要混合流,读者和作家。您正在使用BufferedInputStream:在另一端使用BufferedWriter。