Java - 在哪里检测并捕获SocketException

时间:2016-03-13 18:01:13

标签: java multithreading sockets

我有一个Java服务器/客户端应用程序,允许客户端输入,直到断开连接,使用while循环。这是在扩展ClientHandler并使用Thread方法的run()类对象内部完成的,因此每个连接的客户端都在其自己的Thread上进行通信。

到目前为止发生了这种情况:

public void run()
{
    //receive and respond to client input
    try
    {
        //strings to handle input from user
        String received, code, message;

        //get current system date and time
        //to be checked against item deadlines
        Calendar now = Calendar.getInstance();

        //get initial input from client
        received = input.nextLine();                

        //as long as last item deadline has not been reached
        while (now.before(getLastDeadline()))
        {   
            //////////////////////////////////
            ///processing of client message///
            //////////////////////////////////

            //reload current system time and repeat loop 
            now = Calendar.getInstance();

            //get next input from connected client
            received = input.nextLine();
            //run loop again
        }
    }
    //client disconnects with no further input
    //no more input detected
    catch (NoSuchElementException nseEx)
    {
        //output to server console
        System.out.println("Connection to bidder has been lost!");
        //no system exit, still allow new client connection
    }
}

一切正常,当客户端停止运行程序时会处理NoSuchElementException(因为没有后续输入)。

我想要做的是检测客户端Socket何时与服务器断开连接,以便服务器可以更新当前连接的客户端的显示。我被告知要通过捕获SocketException来做到这一点,并且我已经阅读了这个异常,但我仍然对我将如何实现它感到困惑。

根据我的理解(虽然我可能错了),SocketException必须在客户端被捕获。它是否正确?如果是这种情况,SocketException可以与我已经拥有的NoSuchElementException一致,还是必须删除/替换该例外?

如何合并捕捉SocketException的一个基本示例将是一个巨大的帮助,因为我无法在线找到任何相关的例子。

谢谢,

标记

1 个答案:

答案 0 :(得分:1)

您实际上已经抓住了SocketExceptionnextLine调用将(最终)调用read()返回的基础SocketInputStream上的Socket。对read()的此调用将抛出SocketExceptionIOException的子类)。 Scanner类将捕获IOException,然后返回NoSuchElementException。所以你真的没有什么需要做的。

如果您已经抓住了SocketException,可以在ioException上致电Scanner,以便访问实际的NoSuchElementException。此外,如果您尝试跟踪已连接客户端的列表,则必须在服务器端完成此操作。您可以在客户端捕获SocketException,但这表示服务器意外断开连接,这并非您真正想要的。