2017-10-04 55 views
-1

我正在用java編寫一個基本的聊天服務器,但是我遇到了一些問題。當有人創建客戶端或服務器時,我希望他們能夠輸入一個命令行參數,該參數用作所發送消息的前綴。這個參數也應該是可選的。我有一定程度的工作,出於某種原因,當我發送消息時,它會發送兩次前綴,也不是可選的。任何幫助表示讚賞,乾杯!Java ChatServer - 可選的前綴

public class ReadWriteThread extends Thread { 

    private BufferedReader input; 
    private PrintWriter output; 
    private String prefix; 

    public ReadWriteThread(InputStream input, OutputStream output, String prefix) { 
     this.input = new BufferedReader(new InputStreamReader(input)); 
     this.output = new PrintWriter(output, true); 
     this.prefix = prefix; 
    } 

    public void run() { 
     try { 
      String line; 
      while ((line = input.readLine()) != null) { 
       output.println(prefix + " " + line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public class Server { 

    public static void main(String[] args) { 
     try { 
      int port = Integer.parseInt(args[0]); 
      System.out.println("HELLO " + args[1]); 
      String prefix = args[1]; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.err.println("Waiting for a client to connnect"); 
      Socket socket = serverSocket.accept(); 
      System.err.println("Accepted connection on port " + port); 
      new ReadWriteThread(System.in, socket.getOutputStream(), prefix).start(); 
      new ReadWriteThread(socket.getInputStream(), System.out, prefix).start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.err.println("\nUsage: java Server <port>"); 
     } 

    } 

} 

public class Client { 

    public static void main(String[] args) { 
     Socket socket = null; 
     try { 
      int port = Integer.parseInt(args[0]); 
      String prefix = args[2]; 
      socket = new Socket(args[1], port); 
      System.err.println("Connected to " + args[1] + " on port " + port); 
      new ReadWriteThread(System.in, socket.getOutputStream(), prefix).start(); 
      new ReadWriteThread(socket.getInputStream(), System.out, prefix).start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.err.println("\nUsage: java Client <port>"); 
     } 
    } 
} 

開始由進入

java Client 7777 localhost 
進入

java Server 7777 OPTIONALPREFIX 

啓動客戶端的服務器

服務器上

Waiting for a client to connnect 
Accepted connection on port 7777 
-->-->hello 
-->-->whats up 

回答

1

客戶端和服務器的前面加上一個前綴,以他們的信息電流輸出,你可能已經設置-->爲前綴爲他們兩個。

所以客戶可能發送

--> hello 

然後服務器接收它,並將其記錄到控制檯

--> --> hello 

爲什麼不前綴可選之前預先考慮自己的前綴?因爲你總是試圖閱讀它,所以你從不檢查傳遞給程序的參數的數量。

String prefix = args[1]; 

爲了訪問args[1]你首先需要檢查args是否包含兩個參數。

+0

在客戶端,行「new ReadWriteThread(System.in,socket.getOutputStream(),prefix).start();」將發送文本+前綴到服務器。在服務器端,行「new ReadWriteThread(socket.getInputStream(),System.out,prefix).start();」將顯示從客戶端接收的文本(以及前綴),並添加前綴=>,因此在這裏,您有兩次preifx – Tuco