4

galaxy tabmyと myを接続しようとしていlaptopます。そのため、ラップトップでサーバー アクティビティを実行し、タブでクライアント アクティビティを実行しようとしていますが、うまくいきません。サーバーとクライアントのコードは次のとおりです。間違いはどこですか?

サーバ:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView txt = (TextView)findViewById(R.id.textView1);

    int port = 12345;
    byte [] message = new byte [1500];
    DatagramPacket p = new DatagramPacket (message,message.length);
    try {
        InetAddress serveraddr = InetAddress.getByName("192.168.1.116");
        DatagramSocket s = new DatagramSocket (port,serveraddr);
        while (true){
            s.receive(p);
            String text = new String (message,0,p.getLength());
            txt.setText(text);
        }
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

クライアント:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final EditText edt = (EditText)findViewById(R.id.editText1);
    Button btn = (Button)findViewById(R.id.button1);
    btn.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            String msg = edt.getText().toString();
            int port = 12345;
            try {
                DatagramSocket s = new DatagramSocket();
                InetAddress local  = InetAddress.getByName("192.168.1.116");
                int msg_lenght = msg.length();
                byte []message = msg.getBytes();
                DatagramPacket p = new DatagramPacket(message,msg_lenght,local,port);
                s.send(p);
            } catch (SocketException e) {                   
                e.printStackTrace();
            } catch (UnknownHostException e) {                  
                e.printStackTrace();
            } catch (IOException e) {               
                e.printStackTrace();
            }               
        }
    });
}

ログは次のとおりです。

09-17 23:49:55.190: D/dalvikvm(5892): CheckJNI の遅延有効化 09-17 23:49:55.690: D/CLIPBOARD(5892): クリップボード ダイアログを非表示にする! 09-17 23:49:59.590: D/AndroidRuntime(5892): VM をシャットダウンしています 09-17 23:49:59.590: W/dalvikvm(5892): threadid=1: キャッチされない例外で終了するスレッド (group=0x40c4f1f8) 09 -17 23:49:59.590: E/AndroidRuntime(5892): 致命的な例外: メイン 09-17 23:49:59.590: E/AndroidRuntime(5892): android.os.NetworkOnMainThreadException 09-17 23:49:59.590: E /AndroidRuntime(5892): android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 09-17 23:49:59.590: E/AndroidRuntime(5892): libcore.io.BlockGuardOs.sendto(BlockGuardOs. java:175) 09-17 23:49:59.590: E/AndroidRuntime(5892): libcore.io.IoBridge.sendto(IoBridge.java:463) 09-17 23:49:59 で。137) 09-17 23:49:59.590: E/AndroidRuntime(5892): android.app.ActivityThread.main(ActivityThread.java:4507) 09-17 23:49:59.590: E/AndroidRuntime(5892): at java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-17 23:49:59.590: E/AndroidRuntime(5892): java.lang.reflect.Method.invoke(Method.java:511) 09-17 23 :49:59.590: E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978) 09-17 23:49:59.590: E/AndroidRuntime(5892): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 09-17 23:49:59.590: E/AndroidRuntime(5892): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-17 23 :50:34.320: I/Process(5892): シグナルを送信しています。PID: 5892 SIG: 9 4507) 09-17 23:49:59.590: E/AndroidRuntime(5892): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-17 23:49:59.590: E/AndroidRuntime(5892): Java で.lang.reflect.Method.invoke(Method.java:511) 09-17 23:49:59.590: E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 978) 09-17 23:49:59.590: E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 09-17 23:49:59.590: E/AndroidRuntime( 5892): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-17 23:50:34.320: I/Process(5892): 信号を送信しています。PID: 5892 SIG: 9 4507) 09-17 23:49:59.590: E/AndroidRuntime(5892): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-17 23:49:59.590: E/AndroidRuntime(5892): Java で.lang.reflect.Method.invoke(Method.java:511) 09-17 23:49:59.590: E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 978) 09-17 23:49:59.590: E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 09-17 23:49:59.590: E/AndroidRuntime( 5892): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-17 23:50:34.320: I/Process(5892): 信号を送信しています。PID: 5892 SIG: 9 E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978) 09-17 23:49:59.590: E/AndroidRuntime(5892): com.android.internal で.os.ZygoteInit.main(ZygoteInit.java:745) 09-17 23:49:59.590: E/AndroidRuntime(5892): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-17 23:50:34.320: I/Process(5892): シグナルを送信しています。PID: 5892 SIG: 9 E/AndroidRuntime(5892): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978) 09-17 23:49:59.590: E/AndroidRuntime(5892): com.android.internal で.os.ZygoteInit.main(ZygoteInit.java:745) 09-17 23:49:59.590: E/AndroidRuntime(5892): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-17 23:50:34.320: I/Process(5892): シグナルを送信しています。PID: 5892 SIG: 9

4

4 に答える 4

4
09-17 23:49:59.590: E/AndroidRuntime(5892): android.os.NetworkOnMainThreadException
09-17 23:49:59.590: E/AndroidRuntime(5892):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
09-17 23:49:59.590: E/AndroidRuntime(5892):     at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:175)

UI スレッドでネットワークや時間のかかる操作を行うべきではありません

一部のアプリ ユーザーまたは Android 開発者向けの情報については、Android: NoClassDefFoundErrorも参照 してください。

チェックアウト: activity.runOnUi

于 2012-09-18T09:17:25.040 に答える
0

コードに 2 つの問題がある

  1. メイン スレッド (UI スレッド) でネットワークを操作する

09-17 23:49:59.590: E/AndroidRuntime(5892): 致命的な例外: メイン 09-17 23:49:59.590: E/AndroidRuntime(5892): android.os.NetworkOnMainThreadException

  1. while(true)メイン スレッドでループします。

    while(true) {
        s.receive(p);
        String text = new String (message,0,p.getLength());
        txt.setText(text);
    }
    
于 2015-03-10T15:22:04.807 に答える
0

サーバーの onCreate に無限ループがあります。あなたはすべきではありません!ソケットをポーリングするためのスレッドを作成します。

于 2012-09-18T09:10:43.337 に答える