Я надеюсь, что кто-то может внести свой вклад в решение моей проблемы.Я потратил много времени на поиск решения, включая этот форум, но не смог.
У меня запущен сервер сокетов php, и я пытаюсь подключить мое приложение для Android кэто и обмен данными.Я знаю, что сервер php работает, по крайней мере, для клиента php, поэтому я предполагаю, что проблема где-то в клиенте Android.
Приложение работает на 7-дюймовом планшете Android, Android 2.1
Ниже приведены, как мне кажется, наиболее релевантные фрагменты кода. Я думаю, что важно отметить, что это происходит как при наличии Wi-Fi-соединения, так и нет. Я уверен, что мне не нужны все разрешения, показанные вманифест, но я включил их по предложению одного из потоков, которые я прочитал.
Исключение, которое выдается, говорит: "java.net.SocketTimeoutException: сокет не подключен". Я попытался увеличить время ожиданияпредел без везения
Это клиент для Android, который пытается подключиться к внешнему серверу:
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();
}
}
Мой файл манифеста выглядит так:
<?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-адрес, который не существует.Это вернул true на проверке isUnresolved ().Port.connect () выдал исключение UnknownHostException с сообщением «Хост не разрешен».
Из этого теста я думаю, что мой InetSocketAddress действителен.
Кто-нибудь знает, почему мой клиент получает времяout ??
EDIT: я попробовал свой код (см. выше) на 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 com.android.internal.view.IInputMethodClient$Stub$Proxy@46fe5eb0 (uid=10001 pid=831)
I/startInputInner( 831): mService.startInput fail,retry left=2
W/InputManagerService( 738): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@46fe5eb0 (uid=10001 pid=831)
I/startInputInner( 831): mService.startInput fail,retry left=1
W/InputManagerService( 738): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@46fe5eb0 (uid=10001 pid=831)
I/startInputInner( 831): mService.startInput fail,retry left=0
W/InputManagerService( 738): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@46fe5eb0 (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