2014-01-09 47 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。

相關問題