Android:如何设置OutputStream的超时?

时间:2018-01-30 04:03:04

标签: android sockets outputstream ioexception

我使用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();
        }
  }

1 个答案:

答案 0 :(得分:1)

请参阅套接字 ServerSocket 。这两个类都有一个 setSoTimeout 方法,用于指定等待连接或等待接收数据时等待的最长时间。当该时间结束时,套接字会抛出一个SocketTimeoutException,您可以使用错误消息处理,或者您想要处理。 在执行您想要超时的操作之前,您必须先调用setSoTimeout()。 之前

while ((numberReceived = socketInputStream.read(buffer)) != -1) {
//You'll need to call
socket.setSoTimeout(2000);

然后将catch(SocketTimeoutException)部分添加到您已有的try / catch块中。