1

(Android)クライアントがサーバーと通信できるようにしようとしています。データクライアント->サーバーの送信は正常に機能しますが、サーバーが応答するようにします。クライアント側のコードは次のとおりです。

try {
                Socket s = new Socket("192.168.0.36", 12390);
                s.setSoTimeout(5000);

                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.newLine();
                out.write("###");
                out.flush();
                Log.d(TAG, "sent");


                String inputLine = null;
                String result = "";
                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));  

                Log.d(TAG, "open input");
                while ((inputLine = in.readLine()) != null) {
                    Log.d(TAG, "while");
                    if (inputLine.contains("###")) {
                        break;
                    }
                    result = result.concat(inputLine);

                }

                Log.d(TAG, "closing socket");
                s.close();

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

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()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));



            String inputLine = null;
            String result = "";
            while ((inputLine = in.readLine()) != null) {

                if (inputLine.contains("###")) {
                    System.out.println("received ###");
                        out.write("Hello phone");
                        out.newLine();
                        out.write("###");
                        out.newLine();
                        out.flush();

                }

                result = result.concat(inputLine);  


            }
            System.out.println(result);

            out.close();

サーバーはクライアントからメッセージを正しく読み取り、###を受信した後はメッセージを送り返す必要がありますが、クライアントはそれを受信しません。クライアントがタイムアウトします

                    while ((inputLine = in.readLine()) != null) {
                    Log.d(TAG, "while");
                    if (inputLine.contains("###")) {
                        break;
                    }

whileループには決して入りません。ここで何が欠けていますか?どんなアイデアでもありがたいです!

4

2 に答える 2

2

クライアントから:

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

サーバーがreadLine()を使用しているため、「###」を送信した後に新しい行を追加するのを忘れました

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

したがって、サーバーはこのメッセージを受信できないと思います。入れてみてください

   out.newLine();

「###」を送信した後。

于 2012-07-26T09:29:00.473 に答える
0

私はここで非常に間違っているかもしれませんが、私の経験では、通信を開始する前に常にインストリームとアウトストリームの両方を開きます。動かしてみてください

BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));  

すぐ隣に

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

入力ストリームを開いて読み取りを開始する前にパケットが期限切れになった場合に備えて。

于 2012-07-26T08:55:15.857 に答える