2011-04-07 135 views
2

我希望有人可以爲我的問題提供解決方案。我花了很多時間尋找解決方案,包括這個論壇,但都沒有成功。Android套接字客戶端超時

我有一個PHP套接字服務器運行,我試圖讓我的Android應用程序連接到它並交換數據。我知道PHP服務器的工作,至少對於一個PHP客戶端,所以我猜這個問題是在Android客戶端內的某個地方。

該應用程序在Android 7" 平板電腦上運行的Android 2.1

下面是什麼,我認爲,最相關的代碼片斷。我想提一提,這種情況是很重要的兩個時,有Wi-Fi連接我確信我不需要清單中顯示的所有權限,但是我在其中一個讀取的線索的建議中包含了它們。

拋出的異常說:「java.net .SocketTimeoutException:Socket未連接「。我試過增加超時限制,但沒有運氣

這是androi

import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class test extends Activity{ 
    private static final String TAG = "socketTest"; 

    public SocketAddress remoteAdr = new InetSocketAddress("111.222.333.444", 1234); 
    public Socket socket; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Log.d(TAG, "Start the socket thread.."); 
     startThread(); 
    } 

    void startThread(){ 
     Thread t = new Thread(){ 
      public void run(){ 
       Log.d(TAG, "Socket thread started !"); 
       boolean loop = true; 

       while(loop){ 
        try{ 
         Log.d(TAG, "Create the socket"); 
         socket = new Socket(); 

         Log.d(TAG, "Try to connect the socket"); 
         socket.connect(remoteAdr, 15000); 

         Log.d(TAG, "I'm never shown.."); 
        }catch(Exception e){ 
         Log.e(TAG, "Error when connecting: " + e); 
        } 

         Log.d(TAG, "Done trying"); 
         loop = false; 
        } 
       } 
      }; 
     t.start(); 
    } 
} 

我的清單文件看起來像這樣:嘗試連接到外部服務器d客戶

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.henda.test" 
    android:versionCode="1" 
    android:versionName="1.0"> 

    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"></uses-permission> 
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission> 
    <uses-permission android:name="android.permission.DUMP"></uses-permission> 
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA"></uses-permission> 
    <uses-permission android:name="android.permission.READ_INPUT_STATE"></uses-permission> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"></uses-permission> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name="com.socket.test.test" 
       android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

的PHP套接字服務器:

$loop = 1; 
set_time_limit (1); 

// set some variables 
$host="111.222.333.444"; 
$port = 1234; 

// Create the socket, bind it to a port and start listening (accepts 3 connectinons in the queue). 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket \n"); 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket \n"); 
$result = socket_listen($socket, 3) or die("Could not set up socket listener \n"); 

do{  
    // spawn another socket to handle communication and 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection \n"); 

    // Accept incoming connections and wait for user input 
    $input = socket_read($spawn, 1024) or die("Could not read input \n"); 

    switch(trim($input)){ 
     case "someCase":{ 
      // do something here, f.x. connect to a database 
      // code omitted 
      break; 
     } 
     case "END": 
     { 
      $loop = 0; 
      break; 
     } 
    }while($loop); 
socket_close($socket); 

我已經試過看我的InetSocketAddress是否有效

InetSocketAddress p1 = (InetSocketAddress)remoteAdr; 
Log.d(TAG, "isUnresolved: " + p1.isUnresolved()); 

使用我的正確IP地址和端口號將返回false。

然後爲了比較,我嘗試了一個不存在的不同IP地址。這在isUnresolved()檢查上返回true。 port.connect()拋出一個UnknownHostException,並顯示消息「Host is unresolved」。

從這個測試我猜我的InetSocketAddress是有效的。

有沒有人有線索爲什麼我的客戶得到超時?

編輯: 我在HTC Desire上試過我的代碼(見上面),並且日誌顯示了相同的信息,因此看起來好像這個問題沒有修復到我的平板電腦上。我在代碼中丟失了什麼,無論是在客戶端還是服務器端?

我想知道服務器是否拒絕連接,這就是客戶端超時的原因。我的意思是我的InetSocketAddress是有效的,所以我必須做正確的事情。

我包含用「adb logcat t:D AndroidRuntime:E」生成的日誌。有沒有人有一個線索閱讀這篇日誌

---------------------------------------------------------------------------------- 
D/t  (1132): -------------------------------------------- 
D/t  (1132): Start the socket thread.. 
D/t  (1132): Socket thread started ! 
D/t  (1132): Create the socket 
D/t  (1132): Try to connect the socket 
W/InputManagerService( 738): Starting input on non-focused client [email protected] (uid=10001 pid=831) 
I/startInputInner( 831): mService.startInput fail,retry left=2 
W/InputManagerService( 738): Starting input on non-focused client [email protected] (uid=10001 pid=831) 
I/startInputInner( 831): mService.startInput fail,retry left=1 
W/InputManagerService( 738): Starting input on non-focused client [email protected] (uid=10001 pid=831) 
I/startInputInner( 831): mService.startInput fail,retry left=0 
W/InputManagerService( 738): Starting input on non-focused client [email protected] (uid=10001 pid=831) 
I/ActivityManager( 738): Displayed activity com.henda.test/com.socket.test.test: 350 ms (total 350 ms) 
I/startInputInner(1132): mService.startInput fail,retry left=2 
I/startInputInner(1132): mService.startInput fail,retry left=1 
I/startInputInner(1132): mService.startInput fail,retry left=0 
E/libagl ( 738): copybit failed (Unknown error: -1) 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -54 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 54 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm( 738): GC freed 1990 objects/104424 bytes in 169ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -55 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 48 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm(1529): GC freed 261 objects/14536 bytes in 80ms 
D/dalvikvm(11058): GC freed 8233 objects/526624 bytes in 87ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -57 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 48 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm( 976): GC freed 215 objects/17880 bytes in 94ms 
D/dalvikvm(11058): GC freed 8566 objects/519976 bytes in 83ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -53 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 48 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -53 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 1 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm(1523): GC freed 43 objects/2064 bytes in 73ms 
D/dalvikvm(11058): GC freed 8232 objects/526504 bytes in 87ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -52 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 54 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -54 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 48 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm(2199): GC freed 499 objects/24120 bytes in 95ms 
D/dalvikvm(11058): GC freed 8566 objects/519944 bytes in 84ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -55 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 48 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm( 831): GC freed 1006 objects/55656 bytes in 107ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -54 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 48 
D/WPA_CTRL_IFACE(2064): ] 
D/dalvikvm(11058): GC freed 8231 objects/526584 bytes in 83ms 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER RSSI-APPROX] reply=[WIFI RSSI -53 
D/WPA_CTRL_IFACE(2064): ] 
D/WPA_CTRL_IFACE(2064): Global Control: cmd=[DRIVER LINKSPEED] reply=[LINKSPEED 36 
D/WPA_CTRL_IFACE(2064): ] 
E/t  (1132): Error when connecting: java.net.SocketTimeoutException: Socket is not connected 
D/t  (1132): Done trying 
+0

爲了明顯地避免這種情況發生,您可以從平板電腦上的瀏覽器訪問該ip addy,還是通過平板電腦上的外殼ping它? – Torp 2011-04-07 19:11:04

+0

是的,如果我在平板電腦的瀏覽器中輸入我的IP地址,我會得到200 OK響應。 – skari 2011-04-08 08:57:38

+0

我應該使用PHP套接字服務器以外的東西嗎? – skari 2011-07-07 14:06:18

回答

0

首先檢查您的網絡連接類型後,如果您使用的是WiFi,則問題可能是由你的無線的信道的設定所致,改變它&再試一次。

祝你好運。

+0

你有沒有聲稱無線頻道與此有關? OP關於未知主機異常的觀點使得似乎不太可能與TCP/IP層以下的問題(例如WiFi信道)有關。 – Gijs 2012-11-03 21:35:52