2009-06-11 58 views
3

我有一个简单的顽劣服务器(用Groovy写)的Java/Groovy的插座写超时

ServerSocket ss = new ServerSocket(8889); 
Socket s = ss.accept() 
Thread.sleep(1000000) 

而且我希望有超时谁客户端(因为服务器没有消耗它的输入)

Socket s = new Socket("192.168.0.106", 8889) 
s.setSoTimeout(100); 
s.getOutputStream.write(new byte[1000000]); 

但是,此客户端永远阻止。我如何让客户端超时?

谢谢!

回答

3

你可以在它自己的线程中产生客户端,然后旋转锁定/等待(超时时间长)来返回。如果套接字成功,则可能使用未来对象获取返回值。

我确实相信Socket的SO_TIMEOUT设置只影响从套接字读取(..)调用,而不是写入。

您可能会尝试使用SocketChannel(而不是Stream)并产生另一个线程,该线程也具有该Channel的句柄。另一个线程可以在阻塞某个超时之后异步关闭该通道。

1

套接字超时位于TCP层,而不是应用程序层。源机器TCP正在缓冲要发送的数据,并且目标机器网络堆栈正在确认收到的数据,因此没有超时。而且,不同的TCP/IP实现以不同的方式处理这些超时。看看tcpdump(或wireshark,如果你真的很不幸:),你需要的是应用级ACK,即你需要定义客户端和服务器之间的协议。我无法对Java程序包发表评论(您可能想看看nio),但收到该ACK的超时时间通常会与poll/select一起处理。

0

没有办法获得超时,但是如果写入没有完成,您总是可以产生一个关闭连接的线程。