代码之家  ›  专栏  ›  技术社区  ›  Bob Herrmann

java/groovy套接字写入超时

  •  3
  • Bob Herrmann  · 技术社区  · 17 年前

    我有一个简单的行为不好的服务器(用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 回复  |  直到 17 年前
        1
  •  3
  •   Gandalf    17 年前

    您可以在客户机自己的线程中生成客户机,并在其上旋转lock/wait(超时时间长)以返回。可能是用 对象获取返回值,如果 插座 这是成功的。

    我相信套接字的SO_超时设置只会影响套接字的读取(..)调用,而不会影响写入。

    你可以尝试使用

        2
  •  1
  •   Nikolai Fetissov    17 年前

    套接字超时在TCP级别,而不是应用程序级别。源计算机TCP正在缓冲要发送的数据,目标计算机网络堆栈正在确认接收到的数据,因此没有超时。此外,不同的TCP/IP实现以不同的方式处理这些超时。看一看你的电话线是怎么回事 tcpdump (或 wireshark 如果您很不幸:)您需要的是应用程序级别的确认,即您需要定义客户端和服务器之间的协议。我不能评论Java包(您可能想看看 nio ),但该ACK上的接收超时通常由 poll/select .

        3
  •  0
  •   Nuoji    17 年前

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