Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止java中的阻塞套接字_Java_Multithreading_Sockets_Network Programming_Timeout - Fatal编程技术网

停止java中的阻塞套接字

停止java中的阻塞套接字,java,multithreading,sockets,network-programming,timeout,Java,Multithreading,Sockets,Network Programming,Timeout,我有一个调用服务器的java套接字。但是,我不知道在哪个地址可以到达服务器,所以我在几个线程中放置了几个套接字,它们试图通过一个地址到达服务器。我的问题是我不想等待超时,但不知道如何正确地停止套接字及其线程 代码: 我怎样才能中断手术?我考虑线程.Stutter()/Case>一个坏的样式,它也不能正常工作。NET Tcp端点有一个非阻塞的pending方法,允许使用uinsg布尔标志,但我找不到类似的方法 我不知道在哪个地址可以到达服务器,所以我把 几个线程中有几个套接字,它们试图到达服务器

我有一个调用服务器的java套接字。但是,我不知道在哪个地址可以到达服务器,所以我在几个线程中放置了几个套接字,它们试图通过一个地址到达服务器。我的问题是我不想等待超时,但不知道如何正确地停止套接字及其线程

代码:

我怎样才能中断手术?我考虑<代码>线程.Stutter()/Case>一个坏的样式,它也不能正常工作。NET Tcp端点有一个非阻塞的
pending
方法,允许使用uinsg布尔标志,但我找不到类似的方法

我不知道在哪个地址可以到达服务器,所以我把 几个线程中有几个套接字,它们试图到达服务器 每个人都有一个地址

糟糕。糟糕的决定。执行一些逻辑步骤来确定服务器的地址。或者,执行一些有助于了解服务器IP地址的操作

这样做,除非这是最后的希望

我的问题是,我不想等待 超时,但不知道如何停止套接字及其线程 对

您没有任何其他选项可以超时。Socket.connect()正在阻塞。除了等待,你什么都做不了

您必须等待超时,因为这是关闭创建的套接字对象的逻辑方式。在超时之前,不能直接关闭。将超时时间减少到应该得到结果的极限(应该接受连接)

我怎样才能中断手术?我认为线程。 而且它也不能正常工作

是的,您不应该执行Thread.stop()或Thread.interrupt()。这些都是糟糕的编程风格

如果超时过期,请对套接字执行close()操作

您应该为客户端套接字设置套接字超时。为套接字设置超时是最佳做法。根据需要,超时时间应在10秒左右或更长

您可以通过调用

  • 用于读取超时,或

  • 对于连接超时,正如您在代码中所做的那样

  • 如果超时过期,将引发
    java.net.SocketTimeoutException
    ,尽管套接字仍然有效。超时必须大于0。零超时被解释为无限超时

    您可能没有在代码中使用try-catch-finally。这是一个更好的设计

    在执行连接超时时,可以修改代码以退出阻塞方法,如下所示:

    try{
       socket = new Socket();
       socket.connect(endpoint,timeout); // **Blocking method**
       OutputStream out = socket.getOutputStream();
       //Write Data here
    }
    catch(Exception e){
       e.printStackTrace();
    }
    finally{
       socket.close();
    }
    

    尝试使用
    thread.interrupt()
    中断线程或关闭套接字。两者都会引发异常。能否向套接字添加超时?超时后,让线程停止。不建议调用
    Thread.interrupt
    。我不希望超时太长,因为应用程序不应该在@prasanth
    Socket上运行太长时间。setSoTimeout()
    设置读取超时<代码>连接(端点,超时)导致连接超时。它们不是同一件事,也不是等价物。情况是,只有一组地址,没有这样的逻辑步骤可以找到them@chr-如果是这种情况,则可以。那就意味着你只能连接有限的服务器。然后你可以采用这种方法。@chr-如果我的答案有帮助,你可能会喜欢投票给他们。还有,如果有,请接受!谢谢
    try{
       socket = new Socket();
       socket.connect(endpoint,timeout); // **Blocking method**
       OutputStream out = socket.getOutputStream();
       //Write Data here
    }
    catch(Exception e){
       e.printStackTrace();
    }
    finally{
       socket.close();
    }