Servidor Java - comunicación de socket de cliente

Estoy tratando de permitir que un cliente (android) se comunique con un servidor. El cliente de envío de datos -> servidor funciona bien, pero quiero que el servidor responda. El código del lado del cliente es:

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();

El lado del servidor es:

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();

El servidor lee el mensaje del cliente correctamente y después de recibir ### debería enviar un mensaje, pero el cliente nunca lo recibe. El cliente agota el tiempo de espera

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

y nunca entra en el bucle while. ¿Que me estoy perdiendo aqui? Cualquier idea apreciada!

Respuesta 1

Del cliente:

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

Olvidó agregar una nueva línea después de enviar "###", porque su servidor usa readLine ()

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

Entonces, creo que su servidor no puede recibir este mensaje. Intenta poner

   out.newLine();

después de enviar "###".

Respuesta: 2

Mi contraseña original para el almacén de claves de Android es 123, cuando cambié a abc usando el comando keytool -storepasswd -keystore my.keystore Ahora, cuando exporto la aplicación usando Eclipse, descubrí que el primero ...

Utilizo una imagen como pantalla de inicio agregando la siguiente línea: SplashScreen-Image: com / package1 / splashimage.png al archivo manifest.mf, que requiere que mi splashimage.png se incluya en el ...

Estoy tratando de configurar un HttpClient a través de HttpClientBuilder. También eché un vistazo al HttpClientConnectionManager y aquí comenzó la confusión. En ConnectionManager o más exactamente el ...

Mi aplicación utiliza BorderLayout para mostrar contenido en el marco. También tengo una barra de menú en la parte superior para que se puedan alternar otros cuadros para mostrar. Cuando inicio la aplicación, cada uno de estos contenidos ...