0

早速質問させていただきました。TCP パッケージを送信してサーバーと通信できるアプリを作成しようとしています。その後、サーバーは TCP パッケージを送り返すか、他のデバイスに送信します。しかし、TCP パッケージがデバイスで受信されたときに通知を行うサービスを作成するにはどうすればよいでしょうか?

これを試しました。

 extends Service {
Thread henk;

private static final String TAG = "Service";

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

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");
    henk = new Thread(new Runnable(){

        public void run() {
            // TODO Auto-generated method stub
            try {
                Boolean end = false;
                ServerSocket ss = new ServerSocket(1337);
                while(!end){
                        //Server is waiting for client here, if needed
                        Socket s = ss.accept();
                        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));

                        String st = input.readLine();
                        Log.d("Tcp Example", "From client: "+st);

                        s.close();

                }
        ss.close();


        } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
        }



    });


}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");

}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");

    henk.run();

}

しかし、それは私のアプリをクラッシュさせるだけです。助けてください?

スタック トレース:

    E/ActivityManager(  240): ANR in tictactoe.elqauto
E/ActivityManager(  240): Reason: Executing service tictactoe.elqauto/.servicere
cieve
E/ActivityManager(  240): Load: 7.09 / 7.29 / 7.5
E/ActivityManager(  240): CPU usage from 9411ms to 3791ms ago:
E/ActivityManager(  240):   1.2% 3857/de.devmil.minimaltext: 1.1% user + 0.1% ke
rnel / faults: 191 minor
E/ActivityManager(  240):   2.5% 240/system_server: 1.9% user + 0.5% kernel / fa
ults: 20 minor
E/ActivityManager(  240):   0.1% 4797/tiwlan_wq: 0% user + 0.1% kernel
E/ActivityManager(  240):   0% 16322/org.adwfreak.launcher: 0% user + 0% kernel
/ faults: 226 minor 1 major
E/ActivityManager(  240):   0% 19108/com.aricent.mtp: 0% user + 0% kernel / faul
ts: 16 minor
E/ActivityManager(  240):   0% 30600/com.google.process.gapps: 0% user + 0% kern
el / faults: 20 minor 5 major
E/ActivityManager(  240): 11% TOTAL: 8% user + 3% kernel + 0.1% iowait
E/ActivityManager(  240): CPU usage from 368ms to 884ms later:
E/ActivityManager(  240):   5.6% 240/system_server: 1.8% user + 3.7% kernel / fa
ults: 15 minor
E/ActivityManager(  240):     5.6% 266/ActivityManager: 1.8% user + 3.7% kernel
E/ActivityManager(  240): 44% TOTAL: 1.9% user + 1.9% kernel + 40% iowait

概要:

だから私がやろうとしているのは、名前を持つTCPパッケージをサーバーに送信することです。サーバーはデータベースからその名前に属するIPを取得し、TCPパッケージをいくつかの情報とともに送信します。解決策が見つからなかったので、ソケットを試してみましたが、今は受信側で立ち往生しています。

4

1 に答える 1

0

通常はそのアドレスがわからないため、Android デバイスで TCP サーバーを実行してもあまり意味がありません。

別の解決策は、サーバーへのクライアント接続を維持し、パッケージを受信するデバイスにパッケージをプッシュすることです。

バッテリー効率の高いソリューションは、Google の C2DM を使用することです。ただし、これにはデバイスが Google アカウントでログインしている必要があります。

于 2012-05-23T19:13:07.040 に答える