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:
- La mejor manera de implementar Socket.io en android
- Conexión larga de sondeo TCP de Android
- Android escucha los mensajes del socket del servidor
- Android socket de programación ... ¿qué da?
- Android VpnService - ¿Cómo reenviar el tráfico interceptado de Internet?
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
- La fuerza de aplicación se cierra al iniciar
- Socket Android: java.net.SocketException: No hay ruta para alojar
- HTTP Vs sockets Vanilla para cargar archivos binarios grandes (50-200 MB) desde un dispositivo Android a través de una red Wi-Fi de un solo salto
- Comunicación de LocalSocket con el dominio de Unix en Android NDK
- ¿Cómo mantener el cliente android conectado al servidor incluso en los cambios de actividad y enviar datos al servidor?
- Reenvío de puertos Android
- Cómo resolver java.net.BindException: error de enlace: EADDRINUSE (Dirección ya en uso)
- Android VpnService proteger socket que se almacena en código nativo?
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(); }