我有一个Java服务器/客户端应用程序,它使用while
循环允许客户端输入直到断开连接。这是在ClientHandler
类对象内部完成的,该对象扩展了Thread
并使用了run()
方法,因此每个连接的客户端都在其自己的线程上进行通信。
到目前为止,这是发生的情况:
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
(因为将没有后续输入)。我想做的是检测客户端套接字与服务器的断开时间,以便服务器可以更新当前连接的客户端的显示。我被告知要通过捕获
SocketException
来做到这一点,并且我已经阅读了这个异常,但是对于如何实现它仍然有些困惑。据我了解(尽管我可能是错的),必须在客户端捕获一个
SocketException
。这样对吗?如果是这种情况,SocketException
是否可以与我已经存在的NoSuchElementException
协调运行,还是必须删除/替换该异常?一个如何结合捕获
SocketException
的基本示例将为您带来巨大的帮助,因为我无法在线找到任何相关示例。谢谢,
标记
最佳答案
您实际上已经在捕获SocketException
了。 nextLine
调用将(最终)调用read()
返回的基础SocketInputStream
上的Socket
。对此read()
的调用将引发SocketException
(这是IOException
的子类)。 Scanner类将捕获IOException
,然后返回NoSuchElementException
。因此,实际上您不需要做任何其他事情。
捕获SocketException
后,可以通过调用ioException
上的Scanner
来访问实际的NoSuchElementException
。另外,如果您要跟踪已连接客户端的列表,则必须在服务器端完成此操作。您可以在客户端捕获一个SocketException
,但这表明服务器意外断开连接,这并不是您真正想要的。