2012-09-29 219 views
3

我已经创建(通过从互联网收集一些代码片段)基于控制台的局域网聊天应用程序。现在我想要基于控制台的应用程序到基于Java的GUI应用程序

使用Netbeans IDE 7.1制作GUI。 它是一个多线程应用程序。 在我的基于控制台的应用程序,每当我想显示输出我去做做

System.out.println(msg) . 

现在我在JFrame窗体想要做,

jTextField1.setText(msg). 

我需要创建一个新的主类并把创建一个实例的JFrameForm并使其可见通过将呼叫

new NewJFrame().setVisible(true); 

,或者我应该做的所有编码中JFrame类本身。我出现在我的实际和工作代码(在控制台)下面

import java.io.DataInputStream; 
import java.io.PrintStream; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class MultiThreadChatClient implements Runnable { 

    // The client socket 
    private static Socket clientSocket = null; 
    // The output stream 
    private static PrintStream os = null; 
    // The input stream 
    private static DataInputStream is = null; 

    private static BufferedReader inputLine = null; 
    private static boolean closed = false; 

    public static void main(String[] args) { 

    // The default port. 
    int portNumber = 2222; 
    // The default host. 
    String host = "127.0.0.1"; 

    if (args.length < 2) { 
     System.out 
      .println("Usage: java MultiThreadChatClient <host> <portNumber>\n" 
       + "Now using host=" + host + ", portNumber=" + portNumber); 
    } else { 
     host = args[0]; 
     portNumber = Integer.valueOf(args[1]).intValue(); 
    } 

    /* 
    * Open a socket on a given host and port. Open input and output streams. 
    */ 
    try { 
     clientSocket = new Socket(host, portNumber); 
     inputLine = new BufferedReader(new InputStreamReader(System.in)); 
     os = new PrintStream(clientSocket.getOutputStream()); 
     is = new DataInputStream(clientSocket.getInputStream()); 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host " + host); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection to the host " 
      + host); 
    } 

    /* 
    * If everything has been initialized then we want to write some data to the 
    * socket we have opened a connection to on the port portNumber. 
    */ 
    if (clientSocket != null && os != null && is != null) { 
     try { 

     /* Create a thread to read from the server. */ 
     new Thread(new MultiThreadChatClient()).start(); 
     while (!closed) { 
      os.println(inputLine.readLine().trim()); 
     } 
     /* 
     * Close the output stream, close the input stream, close the socket. 
     */ 
     os.close(); 
     is.close(); 
     clientSocket.close(); 
     } catch (IOException e) { 
     System.err.println("IOException: " + e); 
     } 
    } 
    } 

    /* 
    * Create a thread to read from the server. (non-Javadoc) 
    * 
    * @see java.lang.Runnable#run() 
    */ 
    public void run() { 
    /* 
    * Keep on reading from the socket till we receive "Bye" from the 
    * server. Once we received that then we want to break. 
    */ 
    String responseLine; 
    try { 
     while ((responseLine = is.readLine()) != null) { 
     System.out.println(responseLine); 
     if (responseLine.indexOf("*** Bye") != -1) 
      break; 
     } 
     closed = true; 
    } catch (IOException e) { 
     System.err.println("IOException: " + e); 
    } 
    } 
} 

//MultiThreadServer.java 


import java.io.DataInputStream; 
import java.io.PrintStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.ServerSocket; 

/* 
* A chat server that delivers public and private messages. 
*/ 
public class MultiThreadChatServer { 

    // The server socket. 
    private static ServerSocket serverSocket = null; 
    // The client socket. 
    private static Socket clientSocket = null; 

    // This chat server can accept up to maxClientsCount clients' connections. 
    private static final int maxClientsCount = 10; 
    private static final clientThread[] threads = new clientThread[maxClientsCount]; 

    public static void main(String args[]) { 

    // The default port number. 
    int portNumber = 2222; 
    if (args.length < 1) { 
     System.out 
      .println("Usage: java MultiThreadChatServer <portNumber>\n" 
       + "Now using port number=" + portNumber); 
    } else { 
     portNumber = Integer.valueOf(args[0]).intValue(); 
    } 

    /* 
    * Open a server socket on the portNumber (default 2222). Note that we can 
    * not choose a port less than 1023 if we are not privileged users (root). 
    */ 
    try { 
     serverSocket = new ServerSocket(portNumber); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 

    /* 
    * Create a client socket for each connection and pass it to a new client 
    * thread. 
    */ 
    while (true) { 
     try { 
     clientSocket = serverSocket.accept(); 
     int i = 0; 
     for (i = 0; i < maxClientsCount; i++) { 
      if (threads[i] == null) { 
      (threads[i] = new clientThread(clientSocket, threads)).start(); 
      break; 
      } 
     } 
     if (i == maxClientsCount) { 
      PrintStream os = new PrintStream(clientSocket.getOutputStream()); 
      os.println("Server too busy. Try later."); 
      os.close(); 
      clientSocket.close(); 
     } 
     } catch (IOException e) { 
     System.out.println(e); 
     } 
    } 
    } 
} 

//ChatClient.java 

/* 
* The chat client thread. This client thread opens the input and the output 
* streams for a particular client, ask the client's name, informs all the 
* clients connected to the server about the fact that a new client has joined 
* the chat room, and as long as it receive data, echos that data back to all 
* other clients. When a client leaves the chat room this thread informs also 
* all the clients about that and terminates. 
*/ 
class clientThread extends Thread { 

    private DataInputStream is = null; 
    private PrintStream os = null; 
    private Socket clientSocket = null; 
    private final clientThread[] threads; 
    private int maxClientsCount; 

    public clientThread(Socket clientSocket, clientThread[] threads) { 
    this.clientSocket = clientSocket; 
    this.threads = threads; 
    maxClientsCount = threads.length; 
    } 

    public void run() { 
    int maxClientsCount = this.maxClientsCount; 
    clientThread[] threads = this.threads; 

    try { 
     /* 
     * Create input and output streams for this client. 
     */ 
     is = new DataInputStream(clientSocket.getInputStream()); 
     os = new PrintStream(clientSocket.getOutputStream()); 
     os.println("Enter your name."); 
     String name = is.readLine().trim(); 
     os.println("Hello " + name 
      + " to our chat room.\nTo leave enter /quit in a new line"); 
     for (int i = 0; i < maxClientsCount; i++) { 
     if (threads[i] != null && threads[i] != this) { 
      threads[i].os.println("*** A new user " + name 
       + " entered the chat room !!! ***"); 
     } 
     } 
     while (true) { 
     String line = is.readLine(); 
     if (line.startsWith("/quit")) { 
      break; 
     } 
     for (int i = 0; i < maxClientsCount; i++) { 
      if (threads[i] != null) { 
      threads[i].os.println("<" + name + "&gr; " + line); 
      } 
     } 
     } 
     for (int i = 0; i < maxClientsCount; i++) { 
     if (threads[i] != null && threads[i] != this) { 
      threads[i].os.println("*** The user " + name 
       + " is leaving the chat room !!! ***"); 
     } 
     } 
     os.println("*** Bye " + name + " ***"); 

     /* 
     * Clean up. Set the current thread variable to null so that a new client 
     * could be accepted by the server. 
     */ 
     for (int i = 0; i < maxClientsCount; i++) { 
     if (threads[i] == this) { 
      threads[i] = null; 
     } 
     } 

     /* 
     * Close the output stream, close the input stream, close the socket. 
     */ 
     is.close(); 
     os.close(); 
     clientSocket.close(); 
    } catch (IOException e) { 
    } 
    } 

回答

0

我假设Netbeans IDE开发应用程序,而不是使用Netbeans平台。有关于构建聊天客户端的DZone博客文章。我认为你需要根据你的问题阅读秋千。这篇博客文章使用AWT,但它对你来说是一个好的开始。

http://www.javaworld.com/jw-01-1997/jw-01-chat.html

0

Java是一种面向对象的语言,所以我觉得你应该创建一个像ChatFrame一个类,这个类ChatFrame应该延长 JFrame类。 (或者可以有一个在“showChatFrame”这样的方法中使用的JFrame的实例,thx为这个点的Hovercraft Full Of Eels!)

所以,你可以在这个ChatFrame类中编写每一个gui代码并进行服务器通信代码在另一个类中。

这是很好的编码风格,以使用强大的模块。你的软件应该是几个模块,它们是通过接口(不是每次都是真正的Java接口)相互通信的

您的主类应该只包含主要方法,并创建一个ServerCommunication对象,该对象进行通信并使用ChatFrame类向用户显示消息。

+3

我同意他应该分开他的顾虑 - 有一个GUI或一系列GUI“视图”类,并有单独的类为聊天机制,但一个小挑剔:我不同意有任何GUI类*扩展* JFrame,因为通常不需要这样做,因为我们要通过以下方式改变JFrame的基本行为是非常罕见的:压倒其一种方法。 –

2

虽然严格来说不是原始问题的一部分,但控制台应用程序和GUI应用程序之间存在很多非常重要的区别。

首先,线程模型是不同的,并且非常重要,您需要花时间了解什么以及在哪里以及如何使用它。首先,千万不要在将会阻止它的Event Dispatching Thread(aka EDT)(主UI线程)中执行任何操作,例如IO操作......在可能的情况下,在后台执行这些操作线程或worker

不要从任何线程更新任何线程的UI组件,然后是EDT。SwingWorker可以帮助在这些情况下,当它不能你需要依靠SwingUtilities.invokeLater/invokeAndWait

相关问题