No obtiene respuesta en la conexión de socket

No puedo obtener respuesta en una conexión de socket y no podía entender lo que está mal con el código. Podría capaz de establecer una conexión de socket con la dirección IP y el número de puerto, y está entrando en

if (nsocket.isConnected()) {} 

Cuando intenté con telnet podría conseguir la respuesta. Pero la entrada tiene otros parámetros como:

POST / setMap HTTP / 1.1 Anfitrión: 192.168.1.1 Tipo de contenido: application / json; Charset = utf-8 Contenido-Longitud: 1234

{"Cmd": "request_get_file_list", "verification": "CVS"}

No sé cómo incluir las características de la conexión como el tipo de contenido, la longitud en mi código.

Aquí está el código:

 public class WebService { public static String devicelisting() { Socket nsocket; String response = null; try { nsocket = new Socket("192.168.1.1", 6666); if (nsocket.isConnected()) { JSONObject json = new JSONObject(); json.put("cmd", "request_get_file_list"); json.put("verification", "CVS"); Log.i("AsyncTask", "doInBackground: Creating socket"); // nsocket = new Socket(); OutputStreamWriter out = new OutputStreamWriter(nsocket.getOutputStream(), StandardCharsets.UTF_8); out.write(json.toString()); Log.i("Webservice", "json.toString"+json.toString()); InputStream in = new BufferedInputStream(nsocket.getInputStream()); BufferedReader r = new BufferedReader(new InputStreamReader(in)); StringBuilder stringbuilder = new StringBuilder(); String line; while ((line = r.readLine()) != null) { stringbuilder.append(line); Log.i("line", "line.line"+line); } response = stringbuilder.toString(); Log.i("Response", response); } else{ Log.i("Response", "not connected"); } } catch (ProtocolException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return response; } 

Por favor, ayúdame a encontrar el problema. Estoy muy atrapado. Por favor, ayúdame a resolver el problema

Para los eventos con socket, es difícil implementar muchas funciones mientras hay algunas bibliotecas (de código abierto) para lograr tal tarea. Considere el uso de Socket.io .

 Properties headers = new Properties(); headers.setProperty("Content-Type","application/json"); // your headers SocketIO socketIO = SocketIO(url, headers); 

Para obtener más información, consulte los documentos de SocketIO

Editar

En su ejemplo dado usted debe utilizar HttpURLConnection como usted está consiguiendo una respuesta del servidor, usted no necesita implementar zócalos. Simplemente GET o POST para buscar o empujar sus datos usando HttpURLConnection.

Para la conexión del zócalo en androide, usted puede utilizar este archivo del esencial que pone simplemente la conexión del zócalo.

 public SocketConnection(OnStatusChanged statusChangedListener, OnMessageReceived messageReceivedListener) { mStatusListener = statusChangedListener; mMessageListener = messageReceivedListener; isRunning = true; try { InetAddress serverAddr = InetAddress.getByName(SERVER_IP); mStatusListener.statusChanged(WAITING); socket = new Socket(serverAddr, SERVER_PORT); try { printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); mStatusListener.statusChanged(CONNECTED); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (isRunning) { retrieveMessage = bufferedReader.readLine(); if (retrieveMessage != null && mMessageListener != null) { mMessageListener.messageReceived(retrieveMessage); } else { mStatusListener.statusChanged(DISCONNECTED); } retrieveMessage = null; } } catch (Exception e) { mStatusListener.statusChanged(ERROR); } finally { socket.close(); } } catch (Exception e) { mStatusListener.statusChanged(ERROR); } } 

ACTUALIZAR

Si desea establecer un encabezado personalizado, sólo debe escribirlos en printWriter .

Cuando escribes

 writer.print ("GET " + szUrl + " HTTP/1.0\r\n\r\n"); 

El bit \ r \ n \ r \ n está enviando una línea de avance / retorno de carro para finalizar la línea y luego otra para indicar que no hay más encabezados. Se trata de un estándar en los formatos HTTP y de correo electrónico, es decir, una línea en blanco indica el final de los encabezados. Con el fin de añadir cabeceras adicionales que sólo tiene que no enviar esa secuencia hasta que haya terminado. Puede hacer lo siguiente en su lugar

 writer.print ("GET " + szUrl + " HTTP/1.0\r\n"); writer.print ("header1: value1\r\n"); writer.print ("header2: value2\r\n"); writer.print ("header3: value3\r\n"); // end the header section writer.print ("\r\n"); 

El código probablemente está atascado en readLine() porque el servidor todavía espera la finalización de la solicitud.

Usted puede cambiarlo a:

 // query out.write("POST /setMap HTTP/1.1\r\n"); // headers out.write("Host: 192.168.1.1\r\n"); out.write("Content-Type: application/json; charset=utf-8\r\n"); out.write("Content-Length: " + json.toString().getBytes(StandardCharsets.UTF_8).length + "\r\n"); // end of the headers out.write("\r\n"); // body out.write(json.toString()); // actually send the request out.flush(); Log.i("Webservice", "json.toString"+json.toString()); 

Creo que está utilizando la herramienta incorrecta para realizar solicitudes HTTP. Los zócalos son canales de red de bajo nivel, tienes que hacer muchas cosas tú mismo.

Debe considerar el uso de una HttpURLConnection en su lugar. Si es posible, sugiero encarecidamente que adopte un enfoque de nivel aún más alto, y utilice algo como retrofit2, por ejemplo.

Muchas gracias por todas las respuestas. Todas las respuestas me llevan a la derecha. Podría capaz de arreglar ese problema, aquí está el código.

  myClient = new Socket("192.168.1.1", 6666); try { JSONObject jsonObject = new JSONObject(); jsonObject.put("cmd", "request_get_file_list"); jsonObject.put("verification", "CVS"); myClient.setKeepAlive(true); try { DataInputStream dis = new DataInputStream(myClient.getInputStream()); DataOutputStream dos = new DataOutputStream(myClient.getOutputStream()); writer = new OutputStreamWriter(dos);//, StandardCharsets.UTF_8) writer.write(jsonObject.toString()); System.out.println("c"); writer.flush(); dos.flush(); System.out.println("output buffer size:" + dos.size()); char c = (char) dis.read(); while (c != '\0') { System.out.print(c); str = str.append(c); if (dis.available() != 0) { c = (char) dis.read(); } else break; } dos.flush(); System.out.println("String:" + str.toString()); normalLoginResponse = str.toString(); } catch (Exception e) { e.printStackTrace(); } 
  • Enviar / Recibir archivo / imagen Socket C # Android
  • El arranque del emulador atascó la estructura x86 en AOSP 4.3 con el emulador: Error al conectar con el zócalo '127.0.0.1:1970'
  • 'Permiso denegado' al conectarse al socket unix abstracto
  • Segunda AsyncTask no se ejecuta
  • ¿Cómo puedo manejar múltiples clientes conectados a un servidor mediante sockets?
  • Socket - Cliente Java, Servidor C #
  • Cuál es la mejor aproximación para enviar grandes paquetes UDP en secuencia
  • InetAddress.getLocalHost (). GetHostAddress () devuelve 127.0.0.1 en Android
  • Acceda a la impresora a través de Wifi desde el dispositivo Android
  • Captura de paquetes de red en Android?
  • Crear SSLSocket por SSLSocketFactory con tiempo de espera de conexión establecido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.