我做了什么:
使用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;
}
}
帮助我或......: 我希望有人可以帮助我,我会在网上等你的回答,谢谢。
答案 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.
}