停止java

时间:2016-09-03 16:21:56

标签: java multithreading sockets network-programming timeout

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

代码:

socket = new Socket();
socket.connect(endpoint, timeout); // **Blocking method**
OutputStream out = socket.getOutputStream();
//Write Data here

如何中断操作?我认为Thread.stop()是一种不好的风格,它也无法正常工作。 .NET Tcp端点有一个非阻塞pending方法,允许使用uinsg布尔标志,但我找不到类似的东西

1 个答案:

答案 0 :(得分:0)

  

我不知道我可以到达服务器的哪个地址,所以我放了   几个线程中的几个套接字,它们试图到达服务器   每个在一个地址上。

BAD。不良决定。执行一些逻辑步骤以确定服务器的地址。或者,执行一些可以帮助您了解服务器IP地址的内容。

这样做,只有这是最后的希望。

  

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

您没有任何其他超时选项。 Socket.connect()正在阻塞。除了等待,你无能为力。

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

  

如何中断操作?我认为Thread.stop()很糟糕   风格,它也无法正常工作。

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

如果超时到期,请在socket上执行close()操作。

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

您可以通过调用

在当前代码中设置超时
  1. socket.setSoTimeout(timeout);用于读取超时,或者

  2. 用于连接超时,connect(endpoint,timeout)就像在代码中一样。

  3. 如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。超时必须> 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();
    }