2013-11-18 3 views
1

У меня есть служба, которая должна ждать команды с сервера. Теперь мне нужно создать сокет с самого начала до конца службы. Я подумал сделать это в методе onCreate() и сохранить Socket в частной переменной и использовать его в BindService() после, но это не сработает. Где моя ошибка или где ошибки? Спасибо всем.Socket In Binding Служба Android

package com.example.testercomunicationandroidservlet; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.provider.ContactsContract.Contacts.Data; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class BindService extends Service { 

    public BindService() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public IBinder onBind(Intent arg0) 
     { 
      // TODO Auto-generated method stub 
      return null; 
     } 

    public void onCreate() 
     { 
      try { 
        Log.i("BindService", "Service Started"); 
        this.socket = new Socket("10.0.2.2", 1500); 
        this.input = new DataInputStream(this.socket.getInputStream()); 
        this.output = new DataOutputStream(this.socket.getOutputStream()); 
        Log.i("Test Server/Android Communication", "Socket: " + this.socket.getInetAddress().toString()); 
        TelephonyManager tm= (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE); 

        this.output.writeUTF(tm.getDeviceId()); 

        Log.i("Inviato IMEI: ", tm.getDeviceId()); 
       } 
      catch (UnknownHostException e) 
       { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      catch (IOException e) 
       { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 

    private Socket socket; 
    private DataInputStream input; 
    private DataOutputStream output; 
} 

LogCat

11-18 15:21:22.633: E/TCP(295): C: Error 
11-18 15:21:22.633: E/TCP(295): java.net.SocketException: The operation timed out 
11-18 15:21:22.633: E/TCP(295):  at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method) 
11-18 15:21:22.633: E/TCP(295):  at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115) 
11-18 15:21:22.633: E/TCP(295):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244) 
11-18 15:21:22.633: E/TCP(295):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:219) 
11-18 15:21:22.633: E/TCP(295):  at java.net.Socket.startupSocket(Socket.java:781) 
11-18 15:21:22.633: E/TCP(295):  at java.net.Socket.<init>(Socket.java:316) 
11-18 15:21:22.633: E/TCP(295):  at com.example.betacomunicate_clientandroid.TCPClient.run(TCPClient.java:53) 
11-18 15:21:22.633: E/TCP(295):  at com.example.betacomunicate_clientandroid.MyActivity$connectTask.doInBackground(MyActivity.java:89) 
11-18 15:21:22.633: E/TCP(295):  at com.example.betacomunicate_clientandroid.MyActivity$connectTask.doInBackground(MyActivity.java:1) 
11-18 15:21:22.633: E/TCP(295):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
11-18 15:21:22.633: E/TCP(295):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
11-18 15:21:22.633: E/TCP(295):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
11-18 15:21:22.633: E/TCP(295):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
11-18 15:21:22.633: E/TCP(295):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
11-18 15:21:22.633: E/TCP(295):  at java.lang.Thread.run(Thread.java:1096) 

ответ

0

Вы уверены, что:

  • как Android и сервер находятся на одной и той же сети? (at находятся на одном и том же языке с rooter, который не изолирует клиентов DHCP)
  • У android есть доступ к интернету (adb shell ping kde.org)
  • Андроид действительно может связаться с сервером? (adb shell telnet 10.02.2.2 1500)
  • есть сервер на 10.0.2.2:1500? (смотрите с браузером или telnet 10.02.2.2 1500 у вас на компьютере)

Единственное, что не так до сих пор, это то, что андроид не может подключиться к вашему серверу.

И, наконец, но это скорее выбор дизайна, вы уверены, что хотите использовать такой пользовательский протокол? Ничего подобного HTTP/REST/JSON/PROTOBUF?