【问题标题】:Datagram receive method blocked due to timeout数据报接收方法因超时而阻塞
【发布时间】:2016-02-01 18:06:39
【问题描述】:

我正在开发一个客户端-服务器项目,该项目使用处理数据包丢失和超时的 UDP 套接字发送/接收。由于每次数据包丢失时接收方法都会被阻塞(如果发生超时),我需要找到一种方法来杀死接收套接字被阻塞的线程。问题是,它没有抛出任何异常,所以不知道如何杀死线程。我想终止线程,以便下次尝试再次重新启动。

【问题讨论】:

    标签: java multithreading sockets timeout


    【解决方案1】:

    需要一种方法来杀死线程

    不,你没有。

    您需要一种方法来检测超时。

    设置读取超时,使用setSoTimeout(),并在触发时捕获SocketTimeoutException

    【讨论】:

    • 它是否对应于关闭套接字以防我超时?你能告诉我它是否专门用于阻止输入吗?因为我正在发送数据块,如果我成功接收到数据包,是否可以重置。
    • 它适用于 sockettimeout,但它适用于所有情况。从某种意义上说,如果我开始使用窗口大小等等,是否甚至可以仅通过抛出此异常来管理计时器。如果我只设置一个客户端和服务器,线程或 sockettimoutexception 哪种方式更好?
    • (A) 收到超时异常时,套接字未关闭。 (B) 如果你有一些数据,你没有得到超时。当您输入读取方法时,读取超时开始。您不需要重置它,除非您想更改该值。 (C) 超时就是超时。它适用于所有超时情况。 (D)您关于“通过抛出此异常来管理计时器”的问题对我来说没有任何意义。 (E) 很明显,超时和捕获比两个线程简单得多?
    • 谢谢。我能够捕获异常,因为通过捕获超时异常阻止了接收输入。但是我觉得如果我使用线程会更好,但我不知道如何停止当前正在执行的线程。因为套接字异常超时仅在数据包/ ACK 丢失时发生,所以我无法对所有数据包保持平衡超时(如果成功-> 不等待,则希望给一个时隙以在该时间内接收更多额外的数据包。因此,如果你给我一个关于如何停止当前正在运行进程的线程的提示,那将非常有用
    • 为什么不推荐使用 thread.stop( ),因为它可能在释放线程时有用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多