java.net.Socket不会在Android上抛出IOException

时间:2013-12-20 02:17:04

标签: java android sockets

  • 我做了什么:

    使用Android Mobile上的java.net.Socket编写上传程序

  • 我想要的是什么:

    连接服务器,当IOException发生时(例如网络状态不佳,没有网络等),尝试连接服务器三次

  • 问题:

    关闭WIFI或移动GPRS,然后运行它,没有IOexception发生,APP只是在这一点长时间停止。

  • 只看我的代码:

    try {
        do {
            socket = new Socket();
            SocketAddress socketAddress = new InetSocketAddress(API.UPLOAD_SERVER, API.UPLOAD_PORT);
            socket.setPerformancePreferences(1, 0,0);
            socket.setSoTimeout(1000);
            socket.connect(socketAddress, 2000);
            attempt = 3;
        } while (attempt < 3);
        mListener.onStart();
    } catch (SocketException e) {
        Log.e("UploadTask","exception");
        return;
    } catch (UnknownHostException e) {
        return;
    } catch (IOException ioe) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            return ;
        }
        attempt++;
        if (attempt == 3) {
            return;
        }
    }
    
  • 帮助我或......: 我希望有人可以帮助我,我会在网上等你的回答,谢谢。

2 个答案:

答案 0 :(得分:0)

如果关闭WIFI或GPRS,则没有输出或异常。这是否意味着您的应用程序将会运行,或者您的代码将保留在一个句子中,例如“connect”方法?

我有个建议。如果你想探索android的API,那没关系。

也许您可以在套接字连接之前测试连接。

private boolean isOpenNetwork() {  
    ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);  
    if(connManager.getActiveNetworkInfo() != null) {  
        return connManager.getActiveNetworkInfo().isAvailable();  
    }  

    return false;  
}
希望这可以帮助..

PS:我不知道直接解决你的问题,因为我不知道socket实现细节。也许其他人可以解释它。

答案 1 :(得分:0)

假设“connect”方法成功(可能发生),API的构建方式是在实际读取/写入套接字流时获得IOException。

socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress(API.UPLOAD_SERVER, API.UPLOAD_PORT);
socket.setPerformancePreferences(1, 0,0);
socket.setSoTimeout(1000);
socket.connect(socketAddress, 2000);

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

// Now for example, if you want to read some data
int data;
try( data = is.read() ){
   // Usual processing
} catch( IOException ){
   // Disconnected... try reconnecting etc.
}