2012-12-24 74 views
0

我正在學習用Java編寫代碼。我想和gui寫簡單的聊天。到目前爲止我的應用程序通過命令行工作我有興趣爲客戶端部分構建gui。我很難連接到它。我的問題是,我是否必須爲gui編寫特殊類,而不是在客戶端類中構建這樣一個對象並對其進行操作?特別是我在通過gui建立客戶端和服務器之間的通信時遇到問題。我的命令行應用程序代碼與客戶端部分如下所示。我很感謝在這個問題上的任何建議。從控制檯到GUI的應用程序

public class Client { 
    public static void main(String[] args) { 
     try { 
      Socket socket = new Socket("localhost", 4444); 
      System.out.println("CLIENT: Server connected on port 4444"); 

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      System.out.println("CLIENT: IN and OUT streams opened. Starting sending data..."); 

      ClientInputThread thread = new ClientInputThread(socket); 
      thread.start(); 

      String serverResponse; 
      while ((serverResponse = in.readLine()) != null) { 
       System.out.println("Server: " + serverResponse); 
       if (serverResponse.equals("koniec")) { 
        break; 
       } 
      } 
      System.out.println("CLIENT: Ending server connection. Closing client streams and socket."); 
      out.close(); 
      in.close(); 
      socket.close(); 
      System.exit(0); 
     } 
     catch (UnknownHostException e) { 
      System.err.println("CLIENT: Trying to connect to unknown host: " + e); 
      System.exit(1); 
     } 
     catch (Exception e) { 
      System.err.println("CLIENT: Exception: " + e); 
      System.exit(1); 
     } 
    } 
} 

public class ClientInputThread extends Thread { 
    private PrintWriter out; 

    public ClientInputThread(Socket clientSocket) { 
     try { 
      out = new PrintWriter(clientSocket.getOutputStream(), true); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

    public void run() { 
     try {  
      BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); 
      String userInput="";  
      while (userInput != null) { 
       userInput = console.readLine(); 
       out.println(userInput); 
       out.flush(); 
       if (userInput.equals("koniec")) { 
        break; 
       } 
      } 
      System.exit(0); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 
} 
+0

連接不應該依賴於它是否是一個CLI或GUI。 –

+0

我同意。但我的主要問題是如何將服務器響應從控制檯引導到gui中的JTextField,以及什麼讓我更加困惑 - 我應該在哪裏放置我的gui代碼 - 在單獨的類或客戶端類中。 – data

+0

關閉主題..使用屬性來保存服務器設置,如端口,網址和其他。還可以使用屬性來保存異常消息。並使用記錄器而不是System.out或System.err。 –

回答

3

通常的做法是將邏輯從GUI儘可能分開。我會創建一個實現發送/接收消息部分的類(或多個類)(看起來像你已經這樣做了)。

這些類應提供公共方法來發送/接收消息,並且可能能夠註冊偵聽器並將其傳入消息。

然後編寫一個GUI類,將其註冊爲服務器類的偵聽器,並在發生MessageReceived事件後更新文本。可以找到事件處理基礎知識herehere是創建和處理自定義事件的示例。

//an interface that will let your server work with its listeners 
interface MessageListener { 
    public void messageSent(); 
} 


class Server { 
    List<MessageListener> listeners = new ArrayList<MessageListener>(); 

    //method to register listeners to be notified of incoming messages 
    public void addListener(MessageListener toAdd) { 
     listeners.add(toAdd); 
    } 

    public void sendMessage() { 
     //code your logic here 
     System.out.println("Message sent"); 

     // Notify everybody that may be interested. 
     for (MessageListener hl : listeners) 
      hl.messageSent(); 
    } 

} 

class GuiImplementation implements MessageListener { 
    @Override 
    public void messageSent() { 
     System.out.println(message); 
    } 
} 

和主類:

class Test { 
    public static void main(String[] args) { 
     Server server = new Initiater(); 
     GuiImplementation gui = new Responder(); 

     //register gui as a listener for incoming/outgoing messages 
     server.addListener(gui); 

     //this will trigger the gui method to process incoming message 
     server.sendMessage(); 
    } 
}