2012-12-24 50 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(); 
    } 
}