Android应用程序被冻结 - Socket异常

时间:2013-06-14 11:00:37

标签: android sockets

我制作了连接远程服务器并发送一些数据的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应用程序。被封锁了。我的问题是如何处理这个?即使服务器关闭,如何继续应用程序并避免错误?

3 个答案:

答案 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异常。你可以抓住它并做你想做的事情