2012-02-16 2 views
11

У меня есть простая клиентская серверная программа. Сервер может принимать соединение от нескольких клиентов. В настоящее время это то, что происходит у моего клиента.
1) Введите LIST в клиенте. Сервер отправит обратно все файлы в текущем каталоге клиенту. 2) Введите «Hello» в клиенте. Сервер должен отправить обратно «Привет». Однако в клиенте клиент читает пустое.
Я ввожу «QUIT» в клиенте. Я вижу только сообщение Hello msg с сервера.
Я не могу понять, почему клиент не читает сообщение Hello msg после его отправки сервером.Как заставить клиентский сокет ждать данных из гнезда сервера

Код клиента

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

код сервера

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;   
    } 
} 

ответ

0

Вы присылаете все команды на сервер, и сервер ищет только «LIST» в качестве специальной команды, все остальное будет обрабатываться «эхо» часть.

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"); 
} 

Я попытался с помощью кода и небольшие изменения выше (так как я получил NPE), и вывод выглядит

ServerSide:

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

КЛИЕНТ СТОРОНА:

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? 

Разве это не ожидаемое поведение?

+0

hello peter Я хочу, чтобы сервер продолжал обрабатывать запросы от клиента, пока клиент не отправит QUIT. Основная проблема заключается в клиентской стороне, когда клиент читает запрос с сервера. Для запроса, кроме QUIT, который отправляется от клиента, клиент читает «» с сервера. – shresthaal

+0

См. Код и вывод выше –

-1

Заявление System.exit(0); в методе запуска clientThread является проблемой.

Это приводит к выходу системы после обслуживания одного клиента.

8

Извините, я не говорю по-английски, это мой первый ответ. Попробуйте ожидание ответа сервера:

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()); 
    } 
    ... 
Смежные вопросы