2

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

4

3 回答 3

3

请记住在 UIThread 之外调用它。遵循教程。在 android 中,所有连接都需要在 UIThread 之外进行管理,在我链接的教程中,您将找到将结果发布回 UI 的简单方法(处理程序、异步任务......)

当然,我们不知道问题是否与仅具有给定代码的线程有关,但这是最常见的错误。

于 2013-06-14T11:09:13.443 回答
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();
于 2013-06-14T11:26:06.213 回答
0

您可以为套接字设置超时。使用Socket.setSoTimeout方法

socket.setSoTimeout(timesinmilis);

通过使用它,您的套接字将引发套接字超时异常。你可以抓住它并做你想做的事

于 2013-06-14T11:03:19.463 回答