我制作了连接远程服务器并发送一些数据的android应用程序。 远程服务器是Windows应用程序。
连接方法:
private void ConnectToMonitor() {
try {
s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
如果服务器在线,这非常有效。应用程序正在发送数据和服务器正在接收但如果服务器是脱机Android应用程序。被封锁了。我的问题是如何处理这个?即使服务器关闭,如何继续应用程序并避免错误?
答案 0 :(得分:3)
请记住在UIThread之外调用它。 关注this教程。在android中,所有连接都需要在UIThread之外进行管理,在我链接的教程中,您将找到将结果发布回UI的简单方法(处理程序,asynctasks ......)
当然我们不知道问题是关于只有给定代码的线程,但它是最常见的错误。
答案 1 :(得分:2)
首先记得设置套接字超时:
mSocket.setSoTimeout(timeout); //in milliseconds
但是,您可以通过套接字为连接和所有其他I / O操作指定不同的超时:
private void connectToMonitor() {
try {
socket = new Socket();
InetAddress[] iNetAddress = InetAddress.getAllByName(SERVER_ADDRESS);
SocketAddress address = new InetSocketAddress(iNetAddress[0], TCP_SERVER_PORT);
socket.setSoTimeout(10000); //timeout for all other I/O operations, 10s for example
socket.connect(address, 20000); //timeout for attempting connection, 20 s
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其次,在Android中,您应该在单独的线程中执行任何网络I / O !
例如,使用常规Java线程:
String threadName = getClass().getName() + "::connect";
new Thread(new Runnable() {
@Override
public void run() {
connectToMonitor();
}
}, threadName).start();
答案 2 :(得分:0)
您可以为套接字设置A超时。使用Socket.setSoTimeout方法
socket.setSoTimeout(timesinmilis);
通过使用它,您的套接字将抛出套接字timout异常。你可以抓住它并做你想做的事情