Java:如何使用“资源尝试”设置套接字超时

Posted

技术标签:

【中文标题】Java:如何使用“资源尝试”设置套接字超时【英文标题】:Java: How to set a socket timeout with a "try with resources" 【发布时间】:2017-06-07 14:19:55 【问题描述】:

我想设置一个套接字连接超时。我知道我可以使用 connect 方法设置它,但这是我的代码:

try(Socket socket = new Socket(InetAddress.getByName(ip), port);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")), true))

【问题讨论】:

有什么问题?它没有提供所需的输出吗?是不是报错了? 问题是在连接套接字之前我不能使用getInputStream/getOutputStream 【参考方案1】:

您的问题并不清楚您卡在哪里,但您可以继续使用connect 方法:

int timeout = 25000;
try (Socket socket = new Socket()) 
    socket.connect(new InetSocketAddress("abc", 123), timeout);
    try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")), true)) 

    

【讨论】:

如果仍然需要建立连接,如何使用 getInputStream/getOutputStream? 好点。然后你可以嵌套两个 try-with-resources 语句。 感谢它显然有效。我应该多考虑一下!【参考方案2】:
try(Socket socket = new Socket(InetAddress.getByName(ip), port)) 
    socket.connect(adress, timeout);
 catch (Throwable t) 
    handleException(t);

【讨论】:

你设置的超时时间是连接后不能设置的连接超时时间。

以上是关于Java:如何使用“资源尝试”设置套接字超时的主要内容,如果未能解决你的问题,请参考以下文章

如何设置socket的Connect超时

如何在 Java 1.4 中设置 BufferedReader 和 PrintWriter 的超时时间?

如何设置soapui中一个测试步骤的超时?

如何为默认的swagger android客户端设置连接和套接字超时

Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时

如何在python的socket recv方法上设置超时?