0

Hey community ポート 53000 をリッスンし、受信したデータをログに記録する次の ServerSocket があります。ただし、 server.accept() ブロッキング呼び出しを通過できないようです。

public void run() {

        SocketServer server = new ServerSocket(53000);


        //---buffer store for the stream---
        byte[] buffer = new byte[1024];
        //---bytes returned from read()---
        int bytes;

        //---keep listening to the InputStream until an
        // exception occurs---
        while (true) {
            try {

                socket = server.accept();
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                String str = in.readLine();

                Log.i("received response from server", str);

                in.close();
                socket.close();

            } catch (IOException e) {
                Log.e(TAG, e.getMessage());
            } catch (Exception e){
                server.close();
                Log.e(TAG, e.getMessage());
            }
        }

    }

また、マニフェスト ファイルでアプリケーションに INTERNET 権限を付与しました。()

謎に加えて、クライアントの応答がそのポートに送信されることも確認しました。

これを機能させるために特に何かする必要がありますか?

ありがとう。

4

2 に答える 2

10

あなたのコードは非常に乱雑で、コンパイルすらできません。コードをテストできるようにいくつかの調整を行いましたが、正常に動作しています。私が使用したテストアプリケーションは次のとおりです。

package com.test.stackoverflow

import java.io.BufferedReader;

public class ServerSocketTestActivity extends Activity {
    /** Called when the activity is first created. */
    private static String TAG = "ServerSocketTest";

    private ServerSocket server;

    Runnable conn = new Runnable() {
        public void run() {
            try {
                server = new ServerSocket(53000);

                while (true) {
                    Socket socket = server.accept();
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(socket.getInputStream()));

                    String str = in.readLine();

                    Log.i("received response from server", str);

                    in.close();
                    socket.close();
                }
            } catch (IOException e) {
                Log.e(TAG, e.getMessage());
            } catch (Exception e) {             
                Log.e(TAG, e.getMessage());
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new Thread(conn).start();
    }

    @Override
    protected void onPause() {      
        super.onPause();
        if (server != null) {
            try {
                server.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }   
}

このコードと netcat を使用adb shellして、アプリケーションに接続して通信することができました。

于 2012-06-19T19:22:03.610 に答える