2012-12-24 4 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

Согласен. Но моя главная проблема заключается в том, как направить ответы сервера с консоли на, скажем, на JTextField в gui и на то, что меня еще больше озадачивает - где я должен разместить свой код gui - в отдельном классе или в классе клиента. – data

+0

off topic .. Используйте свойства для хранения настроек сервера, таких как порт, URL-адрес и другие. Также используйте свойства для хранения сообщений об исключениях. И используйте регистратор вместо System.out или System.err. –

ответ

3

Обычная практика, чтобы отделить логику от GUI как можно больше. Я бы создал класс (или несколько классов), который реализует часть отправки/получения сообщения (похоже, что вы уже это сделали).

Эти классы должны предоставлять общедоступные методы для отправки и получения сообщений и, возможно, иметь возможность регистрировать слушателей и уведомлять их о входящих сообщениях.

Затем напишите класс GUI, зарегистрируйте его как слушателя с классом вашего сервера и обновите текст, как только произошло событие MessageReceived. Основы обработки событий можно найти here и here - пример создания и обработки пользовательских событий.

Пример

//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(); 
    } 
} 
Смежные вопросы