Java服务器套接字数据输入流读取超时

时间:2014-04-30 12:44:10

标签: java sockets

我当时有java服务器和一个客户端。

  • 客户端连接并发送卡ID(在服务器端阻塞读取是合适的,因为当时只有1个客户端)
  • 如果数据库中不存在卡,则只返回0并关闭套接字(没问题)
  • 如果卡确实存在则发回1
  • 现在客户端必须向服务器发送PIN,但必须有一些超时,比方说10秒。 在这里我不能使用阻塞读取,我该怎么办?套接字setSoTimeout不是一个选项,因为第一个读取是阻塞但第二个不应该是。

3 个答案:

答案 0 :(得分:0)

我的建议是创建一个ExecutorService并用它启动一个线程。

这里有一个例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

答案 1 :(得分:0)

正确(但不是最简单)的方法是使用java.nio.channels.SocketChannel。它的read方法读入ByteBuffer。您可以将它与java.nio.channels.Selector结合使用,以便在不阻塞的情况下从多个套接字中读取(选择器可帮助您找出哪些数据库可用)但在您的情况下,您可能只对SocketChannel感到满意。

使用起来要困难得多 - 没有InputStream,您需要管理ByteBuffer

另一种方法是启动监视程序Thread,该监视程序在超时期间休​​眠,如果客户端尚未发送PIN,则关闭Socket。关闭套接字会中断被阻止的读卡器。

如果你想这样做,有些老问题可以帮助你使用SocketChannel:

答案 2 :(得分:0)

服务器应始终使用读取超时。您可以在第一次请求和回复后更改它。