2012-12-25 92 views
2

我正在做應用程序,它將一些數據從手機發送到PC。我使用套接字來做到這一點。當服務器在線時它可以工作,但是當我嘗試連接錯誤的IP /端口或服務器沒有運行時,應用程序凍結,我無法做任何事情。這是因爲手機上的客戶端試圖連接到服務器。當它嘗試連接到服務器時使用套接字凍結的應用程序

我有主類中,我提出:

Thread cThread = new Thread(new TCPClient(ip, port, message, context)); 
cThread.start(); 

有新的TcpClient方面,因爲我需要做吐司發送信息時或出現錯誤時。在的TcpClient類有:

public void run(){ 
try { 
InetAddress serverAddr = InetAddress.getByName(s_ip); 
Log.d("TCP", "C: Connecting..."); 
Socket socket = new Socket(serverAddr, s_port); 

當服務器在線不言而喻:

Log.d("TCP", "C: Sending: '" + s_msg + "'"); 
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
out.println(s_msg); 
Log.d("TCP", "C: Sent."); 
Log.d("TCP", "C: Done."); 

但是當服務器脫機或者我把錯誤的IP /端口我的應用程序凍結。我暫時無法做任何事情。

有什麼解決方案強制停止嘗試連接服務器一段時間後?例如,5秒鐘後應用程序將趕上並給我錯誤。

我試圖用AsyncTask來做到這一點,即使客戶端試圖連接到服務器,但應用程序仍在工作,但在接受不到我的時間後出現Toast,所以我想要一個解決方案,當客戶端例如5秒鐘無法與服務器連接。

回答

5

您可以設置連接超時。您必須使用Socket類的不同構造函數。歐洲工商管理學院的:

Socket socket = new Socket(serverAddr, s_port); 

使用:

Socket socket = new Socket(); 
socket.connect(new InetSocketAddress(serverAddr, s_port), 5000); 

在超時的情況下拋出一個異常。

1

也許你沒有設置timeoutconnection所以它的「0」在默認情況下,這意味着它永遠不會超時,所以你可以將超時設置爲1分鐘也不會凍結超過一分鐘。

相關問題