2014-01-09 46 views
2

我想创建一个连接到服务器的套接字。用户可以手动输入插座的IP地址和IP端口。与错误的IP导致Android套接字连接导致冻结

当地址和端口有效时没有任何错误,但是当它们不这样做时,它会导致我的整个应用程序冻结。

这是代码:

public void connect() { 
    try { 
     String txHostIP = settings.getString("txHostIP", ""); 
     int txHostport = Integer.parseInt(settings.getString("txHostPort", "")); 

     //Where it all goes wrong. The program just hangs here for eternity 
     socket = new Socket(txHostIP, txHostport); 
     writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 

    } catch (IOException e) { 
     showMessage(context, "Something went wrong"); 
    } 
} 

我要的是一个消息弹出时,可以进行无连接,但程序不会引发异常,如果一个IP地址或端口不正确。

我该如何解决这个问题?任何帮助是极大的赞赏!

编辑:

我已经添加了一些System.out的打印显示一个程序如何挂起。我还添加了5秒的套接字连接超时。该程序甚至不会达到该代码块。

public void connect() { 
    try { 
     String txHostIP = settings.getString("txHostIP", ""); 
     int txHostport = Integer.parseInt(settings.getString("txHostPort", "")); 
     System.out.println("1"); 
     socket = new Socket(txHostIP, txHostport); 
     System.out.println("2"); 
     socket.connect(socket.getLocalSocketAddress(), 5000); 
     System.out.println("3"); 
     writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     System.out.println("4"); 

    } catch (IOException e) { 
     showMessage(context, "Something went wrong"); 
    } 
} 

它只是打印1,然后永远挂起。

+0

你有没有尝试捕捉'UnknownHostException'? – OrhanC1

+0

尝试将'IOException'更改为'Exception'。 –

+1

已经做了Piotr。仍然没有抛出异常:( –

回答

1

设置连接超时时间为5秒 - 根据系统时钟运行计数器,当时间到时,如果没有连接 - 抛出异常并取消连接。

+1

您可能需要在Async任务中设置它,以确保它与连接并行运行 - 如您所述,使用当前代码超时指令不会被调用。 – Xarus

2

如果你想让插座中止你有一定的时间量后,要做到这一点:

int timeout = 5000; 
int port = 1234; 
String address = "localhost"; 
InetSocketAddress inetAddress = new InetSocketAddress(address, port); 
Socket socket = new Socket(); 
socket.connect(inetAddress, timeout); 

Otherways您设置soTimeout前插座将挂起。如果远程主机不可访问,connect方法将抛出SocketTimeoutException。

相关问题