2012-02-16 14 views
11

Tengo un programa de servidor de cliente simple. El servidor puede aceptar la conexión de múltiples clientes. Actualmente esto es lo que está ocurriendo en mi cliente.
1) Escriba LIST en el cliente. El servidor enviará todos los archivos del directorio actual al cliente. 2) Escriba "Hola" en el cliente. El servidor debe devolver "Hola". Sin embargo, en el cliente, el cliente lee en blanco.
Ingresé "QUIT" en el cliente. Solo veo el mensaje Hello desde el servidor.
No puedo entender por qué el cliente no lee el mensaje de saludo después de ser enviado por el servidor.cómo hacer que el socket del cliente espere datos del socket del servidor

Código Cliente

import java.net.*; // Contains Socket classes 
import java.io.*; // Contains Input/Output classes 
import java.nio.CharBuffer; 

class ClntpracticeSandbox{ 

    public static void main(String argv[]){ 


    try{ 
//  
     Socket client=new Socket("localhost", 7777); 
     System.out.println("Connected to server " + client.getInetAddress() 
      + ": " + client.getPort()); 
     System.out.println("local port is " + client.getLocalPort()); 

     BufferedReader kbreader; 
     BufferedWriter writer; 
     BufferedReader reader; 

     kbreader = new BufferedReader(new InputStreamReader(System.in)); 
     writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
     reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     String data = "", datakb, line=null; 

     do{ 
      System.out.print("Text to the server? "); 
      datakb = kbreader.readLine(); 
      writer.write(datakb); 
      writer.newLine(); 
      writer.flush(); 

      System.out.print("Received from the Server: "); 
      line = reader.readLine(); 
      while (line.equals("")==false){ 
       System.out.println(line); 
       line = reader.readLine(); 
      } 
     } while (datakb.trim().equals("QUIT")==false);   
     client.close(); 
     System.exit(0); 

     }catch(Exception e){ 
      System.err.println("Exception: " + e.toString()); 
     } 
    } 
} 

código del servidor

import java.net.*; // Contains Socket classes 
import java.io.*; // Contains Input/Output classes 
import java.nio.file.*; 

class SrvrpracticeSandbox{ 
    public static void main(String argv[]) throws IOException { 
     ServerSocket s = new ServerSocket(7777); 

     System.out.println("Server waiting for client on port " + s.getLocalPort()); 
     int count = 0; 
     do { 
      count = count + 1; 
      Socket connected = s.accept(); 
      new clientThread(connected, count).start(); 
     } while (true); 

    } 
} 

class clientThread extends Thread { 

    Socket myclientSocket = null; 
    int mycount; 
    DataInputStream is = null; 
    PrintStream os = null; 


    public clientThread(Socket clientSocket, int count) { 
     this.myclientSocket = clientSocket; 
     this.mycount = count; 
    } 

    public void run() { 
     try { 

      System.out.println("New connection accepted " + myclientSocket.getInetAddress() + ": " + myclientSocket.getPort()); 

      BufferedReader reader; 
      BufferedWriter writer; 

      reader = new BufferedReader(new InputStreamReader(myclientSocket.getInputStream())); 
      writer = new BufferedWriter(new OutputStreamWriter(myclientSocket.getOutputStream())); 

      String data; 
      String testdirectory = "file1.txt\nfile2.txt\nfile3.txt"; 
      do{ 
       data = reader.readLine(); 
       System.out.println("Received from " +mycount + ":" + data); 
       if (data.equals("LIST")) { 
        writer.write(mycount + "\n"+"150 - Transfer Initiated."+"\n"+ 
          "DATA " +returnDirectoryList().getBytes().length + "\n" + 
          returnDirectoryList() + "\r\n"); 
       } else { 
        writer.write("Server Echos to " + mycount + ":"+ data + "\n"+"This is a new line."+"\r\n"); 
       }     
       writer.newLine(); 
       writer.flush(); 

      }while (data.equals("QUIT") == false); 

      myclientSocket.close(); 
      System.exit(0); 
     } catch (IOException ex) { 
     } 
    } 
    private String returnDirectoryList() 
    { 
     String files = ""; 
     Path dir = Paths.get("."); 
     try { 
      DirectoryStream<Path> stream = 
      Files.newDirectoryStream(dir); 
      for (Path file: stream) { 
       files = files + file.getFileName() +"\n"; 
      } 
     } catch (IOException | DirectoryIteratorException x) { 
      System.err.println("returnDirectoryList "+x.toString()); 
     } 
     return files;   
    } 
} 

Respuesta

0

Usted envía todos los comandos al servidor y el servidor sólo busca "LISTA" como un comando especial, todo lo demás será manejado por el parte "eco"

if (data == null) { 
    continue; 
} 
if (data.equals("LIST")) { 
    writer.write(mycount + "\n" + "150 - Transfer Initiated." + "\n" + 
    "DATA " + returnDirectoryList().getBytes().length + "\n" + 
    returnDirectoryList() + "\r\n"); 
} else { 
    writer.write("Server Echos to " + mycount + ":" + data + "\n" + "This is a new line." + "\r\n"); 
} 

he intentado con su código y los pequeños cambios anteriores (desde que llegué NPE) y la salida se ve como

ServerSide:

Server waiting for client on port 7777 
New connection accepted /127.0.0.1: 52889 
Received from 1:peter 
Received from 1:LIST 

del lado del cliente:

Connected to server localhost/127.0.0.1: 7777 
local port is 52889 
Text to the server? peter 
Received from the Server: Server Echos to 1:peter 
This is a new line. 
Text to the server? LIST 
Received from the Server: 1 
150 - Transfer Initiated. 
DATA 6 
Files 
Text to the server? 

¿No es ese el comportamiento esperado?

+0

hola peter Quiero que el servidor continúe procesando las solicitudes del cliente hasta que el cliente envíe QUIT. El problema principal está en el lado del cliente cuando el cliente lee la solicitud del servidor. Para solicitud, excepto para QUIT, que se envía desde el cliente, el cliente lee "" desde el servidor. – shresthaal

+0

Ver el código y la salida anterior –

-1

La instrucción System.exit(0); en el método de ejecución clientThread es el problema.

Está causando que el sistema salga después de servir a un cliente.

8

Lo siento, no hablo inglés, es mi primera respuesta. Intente esperar la respuesta del servidor:

do{ 
     System.out.print("Text to the server? "); 
     datakb = kbreader.readLine(); 
     writer.write(datakb); 
     writer.newLine(); 
     writer.flush(); 

     System.out.print("Received from the Server: "); 

     DataInputStream dataInputStream = new DataInputStream(client.getInputStream()); 

     int attempts = 0; 
     while(dataInputStream.available() == 0 && attempts < 1000) 
     { 
      attempts++; 
      Thread.sleep(10) 
     } 

     reader = new BufferedReader(dataInputStream); 
     line = reader.readLine(); 

     while (line.equals("")==false){ 
      System.out.println(line); 
      line = reader.readLine(); 
     } 
    } while (datakb.trim().equals("QUIT")==false);   
    client.close(); 
    System.exit(0); 

    }catch(Exception e){ 
     System.err.println("Exception: " + e.toString()); 
    } 
    ... 
Cuestiones relacionadas