0

Androidデバイスで単純なServerSocketアプリケーションを作成しました.telnetを使用して接続しましたが、正常に動作します(送信されたメッセージはlogcatウィンドウに表示されます)。問題は、php ページから接続しようとするときです (PHP ソケットも使用しています)。Android ソケットは最初の接続を受け入れ、それから何かがおかしい - PHP から送信されたメッセージを読んで logcat に表示することもあるが、通常は最初のリクエストと trhen しか受け入れない... 何もない

アンドロイド側コード:

public class TestSocketActivity extends Activity {
private ServerSocket ss;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        
    setSocket();
}
public void setSocket() {

    try {
        ss = new ServerSocket(7000);

        System.out.println("Started");


    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("Accept failed: 4444");
        e.printStackTrace();
    }


    Socket clientSocket = null;
    try {
        clientSocket = ss.accept();
        String s = clientSocket.getRemoteSocketAddress().toString();
        System.out.println(s);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("SS error");
        e.printStackTrace();
    }
    try {
        BufferedReader in = 
                new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine, outputLine;
        while ((inputLine = in.readLine()) != null) {  
            Toast.makeText(getApplicationContext(),"test",1).show();
            System.out.println("in: "+inputLine);
        }
        ss.close();
        setSocket();
        } 

    catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("error");
        e.printStackTrace();
    }




}
}

これは単純な PHP リクエストです。

<?php
error_reporting(E_ALL);


$address = '192.168.0.180';
$port = 7000;

$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$result = socket_connect($socket, $address, $port);

$in = mktime();

socket_write($socket, $in, strlen($in));
socket_close($socket);
?>

... それだけです。おそらく、より簡単な通信がいくつかあります (PHP が Android からの要求を待つことができないように、必要なたびに PHP から Android デバイスに接続する必要があります)。

手伝ってくれてありがとう。

4

1 に答える 1

1

Android ServerSocket は、着信接続を待機し、ストリームの最後に到達するまでそれを読み取ってリクエストを処理し、別の着信リクエストを待機する状態に戻る「無限」ループを維持する必要があることを認識しています。

代わりに、次のようなことを行います。

public void start() throws IOException {
    serverSocket = new ServerSocket(port);
    running = true;

    while(running) {
        Socket connectionSocket = null;
        InputStream input = null;
        OutputStream output = null;

        try {
            connectionSocket = serverSocket.accept();
            input = connectionSocket.getInputStream();
            output = connectionSocket.getOutputStream();

            // At this point do whatever you need to do with these streams
        } catch(Exception e) {
            throw new RuntimeException(e);
        } finally {
            if(input != null) {
                input.close();
            }

            if(output != null) {
                output.close();
            }

            if(connectionSocket != null) {
                connectionSocket.close();
            }
        }
    }

    serverSocket.close();
    serverSocket = null;
}

このメソッドを別のスレッドで実行して、UI スレッドをブロックしないようにします。ユーザーが要求したとき、またはアクティビティが停止したときはすぐに、running 変数を false に設定して、サーバーが正常に停止するようにする必要があります。

于 2012-06-25T21:29:14.143 に答える