2013-02-26 62 views
0

我試圖使用客戶端/服務器搜索命令行中指定的單詞(來自文件)。這裏是我的代碼,但是當客戶端部分運行時什麼也不顯示。要運行服務器,請在命令行中輸入-s <port number> <file.txt>,然後鍵入-c localhost <port number> <word to be searched>
覆蓋run()方法以接受來自命令行的參數

import java.net.*; 
import java.util.*; 
import java.io.*; 

public class quotes { 
    public static InetAddress host; 
    public static ServerSocket serverSocket; 
    public static String target; 
    public static void main(String[] args) throws IOException { 

     if(args[0].equals("-c")){ 
      Client(args); 
      target = args[3]; 
     } 
     else if(args[0].equals("-s")){ 
      System.out.println("Server"); 
      Server(args); 
     } 
    } 

    @SuppressWarnings("resource") 
    public static void Client(String[] args) throws IOException{ 
      String hostname = args[1]; 

      if(hostname.equals("localhost")) host = InetAddress.getLocalHost(); 
      else host = InetAddress.getByName(hostname); 

      int port = Integer.parseInt(args[2]); 

      Socket socket = new Socket(host, port); 

      Scanner input = new Scanner(System.in); 

      Scanner networkInput = new Scanner(socket.getInputStream()); 
      PrintWriter networkOutput = new PrintWriter(socket.getOutputStream(), true); 

      Scanner userEntry = new Scanner(System.in); 

      String response; 



       networkOutput.println(target); 
       response = networkInput.nextLine(); 
       while(!response.equals("|")){ 

        System.out.println("\n " + response); 
        response = networkInput.nextLine(); 
       } 



    } 

    public static void Server(String[] args) throws IOException { 
     int port = Integer.parseInt(args[1]); 
     String file = args[2]; 
     serverSocket = new ServerSocket(port); 
     do { 

      Socket client = serverSocket.accept(); 

      System.out.println("\nNew client accepted.\n"); 


      ClientHandler3 handler = new ClientHandler3(client, file); 

      handler.start();  
     }while(true); 


    } 
} 

    class ClientHandler3 extends Thread { 
     private Socket client; 
     private Scanner input; 
     private PrintWriter output; 
     private ArrayList<String> quotes; 
     public ClientHandler3(Socket socket, String file) { 
      client = socket; 
      try { 
       BufferedReader buffer = new BufferedReader(new FileReader(file)); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       String line = reader.readLine(); 
       try { 
        int ctr = 0; 
        quotes = new ArrayList<String>(); 
        while(line != null){ 
         quotes.add(ctr, line); 

         ctr++; 
         line = buffer.readLine(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 


      } catch (FileNotFoundException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


      try { 
       input = new Scanner(client.getInputStream()); 
       output = new PrintWriter(client.getOutputStream(), true); 
      } 
      catch(IOException e) { 
       e.printStackTrace(); 
      } 
     } 


     public void run() { 
      String target; 
      String message = ""; 
       target= args[3]; 
       for(int i = 0; i<quotes.size(); i++){ 
        if(quotes.get(i).toUpperCase().contains(target.toUpperCase())){ 
         output.println(quotes.get(i)); 
        } 
       } 
       output.println("|"); 
      try { 
       if (client != null) { 
        System.out.println("Closing down connection..."); 
        client.close(); 
       } 
      } 
      catch(IOException e) { 
       System.out.println("Unable to disconnect!"); 
      } 
     } 
    } 


(感謝JB Nizet爵士一些修改和建議),我有一個問題,在target= args[3];class ClientHandler3,因爲我知道這是沒有意義的覆蓋。我是這個編程領域的新人,我需要你的幫助。請幫我弄清楚事情。謝謝!

編輯

import java.net.*; 
import java.util.ArrayList; 
import java.util.Scanner; 
import java.util.StringTokenizer; 
import java.io.*; 

public class quotes { 
    public static InetAddress host; 
    public static ServerSocket serverSocket; 
    public static void main(String[] args) throws IOException { 

     if(args[0].equals("-c")){ 
      Client(args); 
     } 
     else if(args[0].equals("-s")){ 
      System.out.println("SERVER KA!!!"); 
      Server(args); 
     } 
    } 

    @SuppressWarnings("resource") 
    public static void Client(String[] args) throws IOException 
      String hostname = args[1]; 
      String target, response; 
      if(hostname.equals("localhost")) host = InetAddress.getLocalHost(); 
      else host = InetAddress.getByName(hostname); 

      int port = Integer.parseInt(args[2]); 
      target = args[3]; 
      Socket socket = new Socket(host, port); 

      Scanner input = new Scanner(System.in); 

      Scanner networkInput = new Scanner(socket.getInputStream()); 
      PrintWriter networkOutput = new PrintWriter(socket.getOutputStream(), true); 

      // Set up stream from keyboard entry... 
      Scanner userEntry = new Scanner(System.in); 

       networkOutput.println(target); 
       response = networkInput.nextLine(); 
       while(!response.equals("|")){ 
       // Display server's response to user ... 
        System.out.println("\n " + response); 
        response = networkInput.nextLine(); 
       } 

    } 

    public static void Server(String[] args) throws IOException { 
     int port = Integer.parseInt(args[1]); 
     String file = args[2]; 
     String target = ""; 
     serverSocket = new ServerSocket(port); 
     do { 
      // Wait for client... 
      Socket client = serverSocket.accept(); 

      System.out.println("\nNew client accepted.\n"); 

      ClientHandler3 handler = new ClientHandler3(client, file, target); 

      handler.start();  
     }while(true); 


    } 

} 

    class ClientHandler3 extends Thread { 
     private Socket client; 
     private Scanner input; 
     private PrintWriter output; 
     private ArrayList<String> quotes; 
     private String target; 
     public ClientHandler3(Socket socket, String file, String target) { 

      // Set up reference to associated socket... 
      client = socket; 
      try { 
       BufferedReader buffer = new BufferedReader(new FileReader(file)); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       this.target = reader.readLine(); 
       String line = reader.readLine(); 
       try { 
        int ctr = 0; 
        quotes = new ArrayList<String>(); 
        while(line != null){ 
         quotes.add(ctr, line); 

         ctr++; 
         line = buffer.readLine(); 
        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


      } catch (FileNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


      try { 
       input = new Scanner(client.getInputStream()); 
       output = new PrintWriter(client.getOutputStream(), true); 
      } 
      catch(IOException e) { 
       e.printStackTrace(); 
      } 
     } 


     public void run() { 
      String message = ""; 

       target= input.nextLine(); 

       for(int i = 0; i<quotes.size(); i++){ 
        if(quotes.get(i).toUpperCase().contains(target.toUpperCase())){ 
         output.println(quotes.get(i)); 
        } 
       } 
       output.println("|"); 


      try { 
       if (client != null) { 
        System.out.println("Closing down connection..."); 
        client.close(); 
       } 
      } 
      catch(IOException e) { 
       System.out.println("Unable to disconnect!"); 
      } 
     } 
    } 

回答

1

設置目標爲ClientHandler3的領域,所以你可以使用它裏面run()方法。

class ClientHandler3 extends Thread { 
... 
private String target; 

... 

及用途:

this.target = reader.readLine(); 

之前

String line = reader.readLine(); 

線。

+0

謝謝,先生!但是我在'server'方法中調用'ClientHandler3 handler = new ClientHandler3(client,file,args [3])''。但是,應該從客戶端輸入「目標」。可以做些什麼來解決這個問題? – 2013-02-26 12:16:43

+0

您需要將其從客戶端發送到服務器。服務器無法知道您用來運行客戶端的參數。 – BobTheBuilder 2013-02-26 12:23:08

+0

我試圖從客戶端調用'Server(args)',但它仍然獲得服務器的原始參數。我會非常感謝你的幫助。 :) 非常感謝。 – 2013-02-26 12:40:28