1

私はAndroidとJavaプログラミングにかなり慣れていないので、あなたの助けが必要です. 自分の PC (Windows 7) に Android クライアントとサーバーを作成したいと考えています。私のサーバーが間違いなくプログラムされているかどうかをパテ(クライアントを模倣するプログラム(プログラミングミスなし^^))で確認しました。これにより、サーバーが正しくプログラムされていることがわかりました。

ここで、うまく機能しているサーバーを確認できます。

  public class MyServer {
  public static void main (String[] args) throws IOException {

  ServerSocket serverSocket = null;

  try {
      serverSocket = new ServerSocket(4449);
      System.out.println("Listening on port: 4449");
  } catch (IOException e){
      System.err.println("Could not listen on port 4449.");
      System.exit(1);
  }

  Socket clientSocket = null;

  try {
      clientSocket = serverSocket.accept();
   System.out.println("Got connection.");
  } catch (IOException e) {
      System.err.println("Accept failed: 4449.");
      System.exit(1);
  }

  BufferedReader in = null;
  PrintWriter out = null;
  try {
      in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

      out = new PrintWriter(clientSocket.getOutputStream(), true);
  } catch (IOException e) {
      System.err.println("Read failed");
      e.printStackTrace();
  }


  try {

      System.out.println("message: " + in.readLine());
      out.println("hab was bekommen!");
  } catch (IOException e) {
      System.err.println("Can't get a message from Client.");
      e.printStackTrace();

  }
  }
  }

このサーバー用の Android クライアントも作成しようとしましたが、管理できませんでした。

ここに私のメインアクティビティがあります:

public class AndroidClient extends Activity {

EditText textOut;
TextView textIn;
TextView problems;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_android_client);

    textOut = (EditText)findViewById(R.id.textout);
    Button buttonSend = (Button)findViewById(R.id.send);
    textIn = (TextView)findViewById(R.id.textin);
    problems = (TextView)findViewById(R.id.problems);
    buttonSend.setOnClickListener(buttonSendOnClickListener);
}

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


    @Override
    public void onClick(View arg0) {
        //TODO Auto-generated method stub
        Socket client = null;


        BufferedReader in = null;
        PrintWriter out = null;

        try {
            client = new Socket("192.168.2.107", 4449);
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);
        } catch (UnknownHostException e) {
            problems.setText("Unknown host: 192.168.2.107");
        } catch (IOException e) {
            // System.out.println("No Input/Output.");
            problems.setText("No Input/Output.");
        }

        try {
            out.println("Hallo.");
            textIn.setText(in.readLine());
        } catch (IOException e) {
            problems.setText("Can't send/ get message.");
        }
    }   
};



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_android_client, menu);
    return true;
}
    }

ここまでは順調ですね。Androidスマートフォンでアプリを起動すると、アプリは問題なく起動します。次に、EditText フィールド 'textOut' に何かを入力し、'Send' ボタンにプッシュします。その後、画面が真っ暗になり、アプリが閉じます。また、AndroidManifest.xml にアクセス許可を貼り付けて、インターネットに入り、Wifi にアクセスできるようにしました。

私はこの問題に2日間取り組んでいて、まだ解決策を見つけていないので、誰かが私を助けてくれることを願っています. 私は主にこの面 (http://android-er.blogspot.de/2011/01/simple-communication-using.html) ともちろん他の面を使用しましたが、そこでほとんどの情報を入手しました。さらに、私のソースコードには間違いが見られません。

よろしくお願いいたします。

ルーカス5060

編集:ここに私のLogCatがあります:

12-28 20:21:55.929: I/dalvikvm(698): threadid=3: シグナル 3 に反応する 12-28 20:21:56.039: I/dalvikvm(698): スタック トレースを '/data/anr/ traces.txt' 12-28 20:21:56.259: I/dalvikvm(698): threadid=3: シグナル 3 に反応する 12-28 20:21:56.299: I/dalvikvm(698): スタック トレースを '/ data/anr/traces.txt' 12-28 20:21:56.741: D/gralloc_goldfish(698): GPU エミュレーションなしのエミュレーターが検出されました。12-28 20:21:56.771: I/dalvikvm(698): threadid=3: シグナル 3 に反応する 12-28 20:21:56.789: I/dalvikvm(698): スタック トレースを '/data/anr/ traces.txt' 12-28 20:23:58.430: D/AndroidRuntime(698): VM をシャットダウンしています 12-28 20:23:58.430: W/dalvikvm(698): threadid=1: キャッチされない例外で終了するスレッド (グループ=0x409c01f8) 12-28 20:23:58.470: E/AndroidRuntime(698): 致命的な例外: メイン 12-28 20:23:58.470: E/AndroidRuntime(698): android.os. E/AndroidRuntime(698): java.lang.reflect.Method.invokeNative(Native Method) 12-28 20:23:58.470: E/AndroidRuntime(698): java.lang.reflect.Method.invoke(Method. java:511) 12-28 20:23:58.470: E/AndroidRuntime(698): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 12-28 20:23:58.470: E/AndroidRuntime(698): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/AndroidRuntime(698): dalvik.system.NativeStart.main で(ネイティブ メソッド) 12-28 20:23:59.070: I/dalvikvm(698): threadid=3: シグナル 3 に反応する 12-28 20:23:59.100: I/dalvikvm(698): スタック トレースを '/ data/anr/traces.txt' 12-28 20:24:02.420: I/Process(698): シグナルを送信しています。PID: 698 SIG: 9 java.lang.reflect.Method.invoke(Method.java:511) 12-28 20:23:58.470: E/AndroidRuntime(698): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java:784) 12-28 20:23:58.470: E/AndroidRuntime(698): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/ AndroidRuntime(698): dalvik.system.NativeStart.main(Native Method) 12-28 20:23:59.070: I/dalvikvm(698): threadid=3: シグナル 3 12-28 20:23:59.100 に反応: I/dalvikvm(698): スタック トレースを '/data/anr/traces.txt' 12-28 20:24:02.420 に書き込みました: I/Process(698): シグナルを送信しています。PID: 698 SIG: 9 java.lang.reflect.Method.invoke(Method.java:511) 12-28 20:23:58.470: E/AndroidRuntime(698): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java:784) 12-28 20:23:58.470: E/AndroidRuntime(698): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/ AndroidRuntime(698): dalvik.system.NativeStart.main(Native Method) 12-28 20:23:59.070: I/dalvikvm(698): threadid=3: シグナル 3 12-28 20:23:59.100 に反応: I/dalvikvm(698): スタック トレースを '/data/anr/traces.txt' 12-28 20:24:02.420 に書き込みました: I/Process(698): シグナルを送信しています。PID: 698 SIG: 9 ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/AndroidRuntime(698): dalvik.system.NativeStart.main(ネイティブ メソッド) 12-28 20:23:59.070: I/dalvikvm (698): threadid=3: シグナル 3 に反応しています 12-28 20:23:59.100: I/dalvikvm(698): スタック トレースを '/data/anr/traces.txt' に書き込みました 12-28 20:24:02.420 : I/Process(698): シグナルを送信しています。PID: 698 SIG: 9 ZygoteInit.main(ZygoteInit.java:551) 12-28 20:23:58.470: E/AndroidRuntime(698): dalvik.system.NativeStart.main(ネイティブ メソッド) 12-28 20:23:59.070: I/dalvikvm (698): threadid=3: シグナル 3 に反応しています 12-28 20:23:59.100: I/dalvikvm(698): スタック トレースを '/data/anr/traces.txt' に書き込みました 12-28 20:24:02.420 : I/Process(698): シグナルを送信しています。PID: 698 SIG: 9

4

1 に答える 1

1

さて、私の推測では、問題は、推奨されているとはほど遠いメインUIスレッドでこれを行うことです。代わりにAsyncTask、この種の操作(ファイルやWeb、およびその他の多くのものか​​らの読み取り)を実行するための推奨される方法であるチェックアウトを実行する必要があります。

これは、あなたがする必要があると思われるよりも簡単です(これは、それがどのように見えるかについての感覚を与えるためだけのものであることに注意してください):

private class CreateSocketTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        //Do the socket stuff here...
    }

    @Override
    protected void onPostExecute(String result) {
        //This is called when doInBackground has finished
        //From here you'd call a method in the main ui class.
    }
}

こちらがAndroidドキュメントです

ネット上にはたくさんのチュートリアルがあるので、すぐに起動して実行できます。

于 2012-12-28T20:41:40.340 に答える