1

ソケットを使用してTCPサーバーとクライアントを通信したい。テスト済みのサーバーがあり、正しく実行されていますが、Javaでクライアントを実装しようとすると、ソケットの作成時にクラッシュし、理由がわかりません。どうか、誰か助けていただければ幸いです。ありがとう。作成したシンプルなアプリのコードをここに配置します。

    package udp.udp;
    import java.io.IOException;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;

    public class UdpActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      Button buttonSend = (Button)findViewById(R.id.send);
    }

    Button.OnClickListener buttonSendOnClickListener
    = new Button.OnClickListener(){


    @Override
    public void onClick(View arg0) {
            try{

                Socket s = new Socket("192.168.1.13", 5003);

            } 
            catch (UnknownHostException e) {
                e.printStackTrace();
            } 
            catch (IOException e) {
                e.printStackTrace();
            }

    }};
     }

そして私が得る失敗ログ:

    05-22 19:37:47.035: D/AndroidRuntime(997): Shutting down VM
    05-22 19:37:47.045: W/dalvikvm(997): threadid=1: thread exiting with uncaught exception              
    (group=0x409c01f8)
    05-22 19:37:47.065: E/AndroidRuntime(997): FATAL EXCEPTION: main
    05-22 19:37:47.065: E/AndroidRuntime(997): android.os.NetworkOnMainThreadException
    05-22 19:37:47.065: E/AndroidRuntime(997): at 
    android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at     
    java.net.InetAddress.lookupHostByName(InetAddress.java:391)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at    
    java.net.InetAddress.getByName(InetAddress.java:295)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at   
    udp.udp.UdpActivity$1.onClick(UdpActivity.java:55)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    android.view.View.performClick(View.java:3511)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at   
    android.view.View$PerformClick.run(View.java:14105)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    android.os.Handler.handleCallback(Handler.java:605)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    android.os.Handler.dispatchMessage(Handler.java:92)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at android.os.Looper.loop(Looper.java:137)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at   
    android.app.ActivityThread.main(ActivityThread.java:4424)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    java.lang.reflect.Method.invokeNative(Native Method)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    java.lang.reflect.Method.invoke(Method.java:511)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at  
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at 
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    05-22 19:37:47.065: E/AndroidRuntime(997):  at dalvik.system.NativeStart.main(Native    
    Method)
    05-22 19:37:47.635: I/dalvikvm(997): threadid=3: reacting to signal 3
    05-22 19:37:47.655: I/dalvikvm(997): Wrote stack traces to '/data/anr/traces.txt'
    05-22 19:42:47.176: I/Process(997): Sending signal. PID: 997 SIG: 9
4

3 に答える 3

1

StrictMode は、API-10 からデフォルトで適用されました。このリファレンスを確認してください: http://developer.android.com/reference/android/os/StrictMode.html。StrictMode は、開発者がメイン スレッド上のブロック コードを特定するために使用できる便利なツールです (メイン スレッド上のコードをブロックすると ANR が発生し、ネットワーク通信などのブロックがどのくらいの時間続くかわからない場合には問題になります)。

于 2012-05-22T18:09:25.007 に答える
0

Android SDK は、メイン スレッドでネットワークを実行しないことを主張しているようです。こちらを参照してください。

于 2012-05-22T18:09:07.650 に答える
0

UI スレッドでネットワーク アクセスを実行しようとしています。それをしないでください...それは悪いです。

Ice Cream Sandwich がアプリをクラッシュさせる理由

于 2012-06-19T20:23:29.903 に答える