Programación de sockets, ¿por qué el cliente no puede recibir datos del servidor?
Como se mencionó, escribí un programa para la comunicación entre el servidor y el cliente. El servidor puede recibir datos del cliente, pero el cliente no puede recibir los datos enviados por el servidor. -side importar java.io.BufferedReader; importar java.io.IOException; importar java.io.InputStreamReader; importar java.io.PrintWriter; importar java.net.ServerSocket; Piense * * / public class SocketServer { /** * @param args */ public static void main(String[] args) { new SocketServer().start() } public void start(){ try { ServerSocket server = new; ServerSocket(10086); while(true){ System.out.println("Esperando un cliente..."); Cliente de socket = server.accept(); new SocketServerThread(cliente).start(); IOException e) { e.printStackTrace(); } } class SocketServerThread extends Thread{ Socket client = null; public SocketServerThread(Socket client){ this.client = client } @Override public void run(){ try { // Obtener el flujo de entrada de CLIENTE, extraiga los datos transferidos del flujo de entrada BufferedReader Reader_from_client = new BufferedReader(new InputStreamReader(client.getInputStream())); while((line = Reader_from_client .readLine()) != null){ System.out.println(line } // Obtiene el flujo de entrada del CLIENTE y transmite datos al CLIENTE PrintWriterwriter_to_client = new PrintWriter(client.getOutputStream) ()); escritor_a_cliente.println( "Ok"); escritor_a_cliente.flush(); lector_de_cliente.close(); escritor_a_cliente.cerrar(); captura (IOException e) { } } } }
lientimport java.io.BufferedReader; importar java.io.IOException; importar java.io.InputStreamReader; importar java.io.PrintWriter; importar java.net.InetAddress; */ public class SocketClient { /** * @param args */ public static void main(String[] args) { try { Socket RemoteServer = new Socket(InetAddress.getLocalHost(), 10086 // Obtener el SOCKET del lado del SERVIDOR); El flujo de salida se comunica con el SERVIDOR escribiendo datos en el flujo de salida. PrintWriter write_to_server = new PrintWriter(remoteServer.getOutputStream(), true); write_to_server.write("Hola, ¿cómo te llamas?"); Si se publican las siguientes líneas, el SERVIDOR no recibirá los datos y estará en un estado bloqueado // Obtenga el flujo de salida del SERVIDOR y lea los datos pasados del SERVIDOR desde el flujo de salida // BufferedReader lector_de_servidor = nuevo BufferedReader ( new InputStreamReader(remoteServer.getInputStream())); // Línea de cadena = null; // while((line = lector_from_server.readLine()) != null){ // System.out.println(line); // lector_de_servidor.close(); write_to_server.close(); remoteServer.close(); } catch (IOException e) { e.printStackTrace() } } } Si las instrucciones en el Cliente, siempre que el Cliente esté liberado; BufferedReader lector_de_servidor = nuevo BufferedReader(nuevo InputStreamReader(remoteServer.getInputStream())); Línea de cadena = nulo; mientras((línea = lector_de_servidor.readLine()) != nulo){ System.out.println(línea } lector_de_servidor. close(); En este código, el SERVIDOR está bloqueado while((line = Reader_from_client.readLine()) != null){ Esta línea, no sé qué enlace entendí mal o manejé mal, espero que todos puedan darlo. ¡Dame un consejo! Incluso si la conexión no se cierra, no se pueden obtener los datos. Después de leer otras preguntas similares, pregunté.
El problema es que readLine() provocará el bloqueo y ¡todavía estamos buscando una solución! Pregunta complementaria: wgy_superpower escribió: Primero: al programar Socket, nunca cierre el lector antes de cerrar el escritor. Segundo: ya sea que el cliente o el servidor lea datos a través del Socket, cuando sus datos se completen la transmisión, envíe una marca de finalización (para. ejemplo: final), para que pueda juzgar si los datos se han transmitido en su ciclo while y saltar fuera del ciclo una vez finalizado; de lo contrario, su programa siempre se bloqueará aquí en readLine(), porque su socket no se ha desconectado todavía y estará esperando que escriba datos. Lo que dijiste tiene sentido después de experimentos posteriores, de hecho se debe a que readLine () ha estado esperando la entrada del cliente, pero en este momento el cliente también está esperando una devolución del servidor, por lo que ambas partes están esperando allí. obstruido. En una palabra, está esperando escribir datos, pero no se escriben datos, por lo que está bloqueado. Pregunta agregada: anranran escribió SocketServer: while((line = Reader_from_client.readLine()) != null) Esto no se puede generar cuando el socket no está cerrado. Entonces el servidor no envía ningún dato al cliente, bueno, tiene sentido, pero la razón principal no es que el socket no esté cerrado, sino que los datos no se escriben en la secuencia, y readLine() sigue leyendo allí, por lo que está bloqueado!