2012-02-16 51 views
11

我有一個簡單的客戶端服務器程序。服務器可以接受多個客戶端的連接。目前這是我的客戶正在發生的事情。
1)在客戶端輸入LIST。服務器將把當前目錄中的所有文件發送回客戶端。 2)在客戶端輸入「Hello」。服務器應該發回「你好」。但是,在客戶端客戶端讀取空白。
我在客戶端輸入「QUIT」。我只能從服務器上看到Hello msg。
我不明白爲什麼客戶端在它被服務器發回後沒有讀取Hello消息。如何讓客戶端套接字等待來自服務器套接字的數據

客戶端代碼

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)和輸出看起來像

服務器端:

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 2012-02-16 14:00:06

+0

查看上面的代碼和輸出 – 2012-02-29 18:05:04

-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()); 
    } 
    ... 
相關問題