4

私がやろうとしているのは、Android フォンから Java サーバーに JSON を送信することです。これは正常に動作します。Android/ クライアント側は次のようになります。

                    Socket s = new Socket("192.168.0.36", 12390);
                s.setSoTimeout(1500);

                JSONObject json = new JSONObject();
                json.put("emergency", false);
                json.put("imei", imei);
                json.put("lat", l.getLatitude());
                json.put("lon", l.getLongitude());
                json.put("acc", l.getAccuracy());
                json.put("time", l.getTime());


                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                        s.getOutputStream()));
                out.write(json.toString());
                out.flush();
                s.close();

サーバー側は次のとおりです。

        try {
        s = new ServerSocket(port);
    } 
    catch (IOException e) {
        System.out.println("Could not listen on port: " + port);
        System.exit(-1);
    }


    Socket c = null;
    while (true) {
        try {
            c = s.accept();
        } catch (IOException e) {
            System.out.println("Accept failed: " + port);
            System.exit(-1);
        }
        try {

            BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
                String inputLine = null;
            String result = "";
            while ((inputLine = in.readLine()) != null) {
                result = result.concat(inputLine);  
            }
            System.out.println(result);

私が言ったように、それはすべて機能します。クライアントからメッセージを受信した後、サーバーからクライアントにメッセージを送り返したいと思います。Android/クライアント側のコードを次のように拡張しました。

                    Socket s = new Socket("192.168.0.36", 12390);
                s.setSoTimeout(1500);

                JSONObject json = new JSONObject();
                json.put("emergency", false);
                json.put("imei", imei);
                json.put("lat", l.getLatitude());
                json.put("lon", l.getLongitude());
                json.put("acc", l.getAccuracy());
                json.put("time", l.getTime());


                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                        s.getOutputStream()));
                out.write(json.toString());
                out.flush();

                String inputLine = null;
                String result = "";
                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));  
                while ((inputLine = in.readLine()) != null) {
                    Log.d(TAG, in.readLine());
                    result = result.concat(inputLine);
                }

そしてサーバー側:

        try {
    s = new ServerSocket(port);
} 
catch (IOException e) {
    System.out.println("Could not listen on port: " + port);
    System.exit(-1);
}


Socket c = null;
while (true) {
    try {
        c = s.accept();
    } catch (IOException e) {
        System.out.println("Accept failed: " + port);
        System.exit(-1);
    }
    try {

        BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
            String inputLine = null;
        String result = "";
        while ((inputLine = in.readLine()) != null) {
            result = result.concat(inputLine);  
        }
        System.out.println(result);

    PrintWriter out = new PrintWriter(c.getOutputStream());
    out.write("Hello phone");
    out.flush();
    out.close();

クライアント側では、何も入ってきません。

                while ((inputLine = in.readLine()) != null) {
                Log.d(TAG, in.readLine());
                result = result.concat(inputLine);
            }

ソケットがタイムアウトするまで (ループに入ることはありません)。サーバーが応答を送信するのが早すぎるため、クライアントが何も受信しないなど、タイミングの問題である可能性があると思いましたが、 out.write("Hello phone"); を配置しようとしました。コードのほとんどどこでも、常に同じ結果になります。ソケットが ServerSocket から取得され、データを送信できないことに関係がありますか? ここで何が欠けているのですか、これは一日中私を悩ませています...

編集:ニコラスの答えの後、私はこれを試しました(クライアント):

                    out.write(json.toString());
                out.newLine();
                out.write("###");
                out.flush();


                String inputLine = null;
                String result = "";
                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));  
                while ((inputLine = in.readLine()) != null) {
                    if (inputLine.contains("###")) {
                        break;
                    }
                    Log.d(TAG, in.readLine());
                    result = result.concat(inputLine);

                }


                s.close();

およびサーバー:

                while ((inputLine = in.readLine()) != null) {

                result = result.concat(inputLine);  
                if (inputLine.contains("###")) {
                    System.out.println("received ###");
                    out.println("Hello phone");
                    out.println("###");
                    out.flush();
                    break;
                }

            }

アイデアは、クライアントがソケットを閉じる前にサーバーからメッセージを送信することでした。それでもうまくいきません...ヒントはありますか?

4

1 に答える 1

3

サーバー側では、「Hello phone」を送信することはできません。クライアントがソケットを閉じるまでではありませんが、その時点では役に立ちません。これはin.readLine()、データが利用可能になるかEOF、ソケットが閉じられるまでブロックされるためです。

読み取りループから抜け出す方法が必要です。メッセージ全体が受信されたことを通知するアプリケーションレベルのプロトコルを発明 (または採用) します。一般的なオプションは、固定長のメッセージ、長さのプレフィックス、区切り記号などです。

于 2012-07-25T15:48:45.437 に答える