我使用Socket
与客户沟通。我设置OutputStream
的超时时遇到了问题。 Socket本身已经设置了超时。当我没有为OutputStream设置超时时,当OutputStream out = socket.getOutputStream()
关闭互联网连接时,IOException
将在15分钟后抛出。它会影响用户体验。
Socket.java
// Create an SSLContext that uses our TrustManager
final SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
SSLSocket socket = null;
try{
SSLSocketFactory sslsocketfactory = context.getSocketFactory();
socket = (SSLSocket) sslsocketfactory.createSocket();
socket.connect(new InetSocketAddress(<dstAddress>, <dstPort>), <timeout>);
// Here is the point when the internet connection is loss
OutputStream out = socket.getOutputStream();
out.write(BytesUtil.hexStringToBytes(<requestParams>));
out.flush();
} catch(SocketTimeoutException se) {
se.printStackTrace();
} catch (IOException e) {
// Will thrown after 15 minutes
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// close socket
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
请参阅套接字和 ServerSocket 。这两个类都有一个 setSoTimeout 方法,用于指定等待连接或等待接收数据时等待的最长时间。当该时间结束时,套接字会抛出一个SocketTimeoutException,您可以使用错误消息处理,或者您想要处理。
在执行您想要超时的操作之前,您必须先调用setSoTimeout()
。
之前
while ((numberReceived = socketInputStream.read(buffer)) != -1) {
//You'll need to call
socket.setSoTimeout(2000);
然后将catch(SocketTimeoutException)部分添加到您已有的try / catch块中。