解决方案 »

  1.   

    这是聊天界面代码
    package com.zx.Client;import javax.swing.SwingUtilities;
    import java.awt.BorderLayout;
    import java.awt.HeadlessException;import javax.swing.DefaultListModel;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import java.awt.GridBagLayout;
    import javax.swing.JTextArea;
    import javax.swing.JScrollPane;
    import java.awt.GridBagConstraints;
    import javax.swing.JLabel;
    import java.awt.FlowLayout;
    import javax.swing.JTextField;
    import java.awt.Dimension;
    import javax.swing.JButton;import com.zx.model.Info;public class ChatFrame extends JFrame { private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JTextArea jTextArea = null;
    private JPanel jPanel1 = null;
    private JPanel jPanel2 = null;
    private JLabel jLabel = null;
    private JScrollPane jScrollPane = null;
    private JLabel jLabel1 = null;
    private JTextField jTextField = null;
    private JButton jButton = null;
    private JLabel jLabel2 = null;
    private Info info;
    private DefaultListModel listModel;
    private UserServer us;
    /**
     * This method initializes jTextArea
     * 
     * @return javax.swing.JTextArea
     */

    private JTextArea getJTextArea() {
    if (jTextArea == null) {
    jTextArea = new JTextArea();
    }
    return jTextArea;
    } public ChatFrame(Info info, UserServer us) throws HeadlessException {
    super();
    this.info = info;
    this.us = us;
    jLabel2.setText("当前用户: "+info.getToUser());
    setData(info);
    } private void setData(Info info) {
    // TODO Auto-generated method stub
    StringBuffer buf = new StringBuffer();
    buf.append(jTextArea.getText()).append(" \n").append(info.getFromUser()).append("  ").append(info.getTime()).append("\n")
    .append(info.getContent()).append("\n\n");
    jTextArea.setText(buf.toString());
    } /**
     * This method initializes jPanel1
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJPanel1() {
    if (jPanel1 == null) {
    jLabel = new JLabel();
    jLabel.setText("--在线用户列表--");
    jPanel1 = new JPanel();
    jPanel1.setLayout(new BorderLayout());
    jPanel1.add(jLabel, BorderLayout.NORTH);
    jPanel1.add(getJScrollPane(), BorderLayout.CENTER);
    }
    return jPanel1;
    } /**
     * This method initializes jPanel2
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJPanel2() {
    if (jPanel2 == null) {
    jLabel1 = new JLabel();
    jLabel1.setText("请输入:");
    jPanel2 = new JPanel();
    jPanel2.setLayout(new FlowLayout());
    jPanel2.add(jLabel1, null);
    jPanel2.add(getJTextField(), null);
    jPanel2.add(getJButton(), null);
    }
    return jPanel2;
    } /**
     * This method initializes jScrollPane
     * 
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
    if (jScrollPane == null) {
    jScrollPane = new JScrollPane();
    }
    return jScrollPane;
    } /**
     * This method initializes jTextField
     * 
     * @return javax.swing.JTextField
     */
    private JTextField getJTextField() {
    if (jTextField == null) {
    jTextField = new JTextField();
    jTextField.setColumns(25);
    }
    return jTextField;
    } /**
     * This method initializes jButton
     * 
     * @return javax.swing.JButton
     */
    private JButton getJButton() {
    if (jButton == null) {
    jButton = new JButton();
    jButton.setText("发送");
    }
    return jButton;
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    ChatFrame thisClass = new ChatFrame();
    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisClass.setVisible(true);
    }
    });
    } /**
     * This is the default constructor
     */
    public ChatFrame() {
    super();
    initialize();
    } /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
    this.setSize(443, 379);
    this.setContentPane(getJContentPane());
    this.setTitle("QQ聊天窗口");
    } /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
    if (jContentPane == null) {
    jLabel2 = new JLabel();
    jLabel2.setText("JLabel");
    jContentPane = new JPanel();
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJTextArea(), BorderLayout.CENTER);
    jContentPane.add(getJPanel1(), BorderLayout.EAST);
    jContentPane.add(getJPanel2(), BorderLayout.SOUTH);
    jContentPane.add(jLabel2, BorderLayout.NORTH);
    }
    return jContentPane;
    }}  //  @jve:decl-index=0:visual-constraint="10,10"
      

  2.   

    这是客户端线程代码
    package com.zx.Client;import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.Socket;
    import java.net.UnknownHostException;import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.io.xml.Xpp3Driver;
    import com.zx.model.Info;
    import com.zx.util.InfoType;public class UserServer {
    private Socket socket;
    private DataInputStream in;
    private DataOutputStream out;
    private ChatFrame chatFrame;
    private LoginFrame loginFrame;
    public UserServer(LoginFrame loginFrame){
    this.loginFrame = loginFrame;
    }
    public void login(final String username,final String password,final String ip,final int port){
    Thread t = new Thread(new Runnable() {

    @Override
    public void run() {
    // TODO Auto-generated method stub
    try {
    socket = new Socket(ip,port);
    out = new DataOutputStream(socket.getOutputStream());
    Info info = new Info();
    info.setFromUser(username);
    info.setInfoType(InfoType.ONLINE);
    XStream xStream = new XStream(new Xpp3Driver());
    String xml = xStream.toXML(info);
    System.out.println(xml);
    out.writeUTF(xml);
    out.flush();
    Thread t1 = new Thread(new UserThread());
    t1.setDaemon(true);
    t1.start();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    });
    t.start();
    }
    public class UserThread implements Runnable {
    private boolean flag = true;
    Info info = null;
    public void setFlag(boolean flag) {
    this.flag = flag;
    }
    public UserThread() {
    super();
    this.flag = true;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while(flag){
    try {
    in = new DataInputStream(socket.getInputStream());
    String info_XML = in.readUTF();
    XStream xStream = new XStream(new Xpp3Driver());
    info = (Info)xStream.fromXML(info_XML);
    switch (info.getInfoType()) {
    case WELCOME:
    chatFrame = new ChatFrame(info,UserServer.this);
    loginFrame.dispose();
    break; default:
    break;
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    } }
    }
      

  3.   

    这是服务器界面代码
    package com.zx.Server;import javax.swing.SwingUtilities;
    import java.awt.BorderLayout;import javax.swing.DefaultListModel;
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import java.awt.GridBagLayout;
    import javax.swing.JTextArea;
    import javax.swing.JScrollPane;
    import java.awt.GridBagConstraints;
    import javax.swing.JLabel;
    import java.awt.FlowLayout;
    import javax.swing.JTextField;
    import java.awt.Dimension;
    import java.io.IOException;import javax.swing.JButton;
    import javax.xml.ws.Service;public class ServerFrame extends JFrame { private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JTextArea jTextArea = null;
    private JPanel jPanel1 = null;
    private JPanel jPanel2 = null;
    private JLabel jLabel = null;
    private JScrollPane jScrollPane = null;
    private JLabel jLabel1 = null;
    private JTextField jTextField = null;
    private JButton jButton = null;
    private JLabel jLabel2 = null;
    private Server ss;
    private DefaultListModel listModel = null;
    /**
     * This method initializes jTextArea
     * 
     * @return javax.swing.JTextArea
     */
    private JTextArea getJTextArea() {
    if (jTextArea == null) {
    jTextArea = new JTextArea();
    }
    return jTextArea;
    } /**
     * This method initializes jPanel1
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJPanel1() {
    if (jPanel1 == null) {
    jLabel = new JLabel();
    jLabel.setText("--在线用户列表--");
    jPanel1 = new JPanel();
    jPanel1.setLayout(new BorderLayout());
    jPanel1.add(jLabel, BorderLayout.NORTH);
    jPanel1.add(getJScrollPane(), BorderLayout.CENTER);
    }
    return jPanel1;
    } /**
     * This method initializes jPanel2
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJPanel2() {
    if (jPanel2 == null) {
    jLabel1 = new JLabel();
    jLabel1.setText("请输入:");
    jPanel2 = new JPanel();
    jPanel2.setLayout(new FlowLayout());
    jPanel2.add(jLabel1, null);
    jPanel2.add(getJTextField(), null);
    jPanel2.add(getJButton(), null);
    }
    return jPanel2;
    } /**
     * This method initializes jScrollPane
     * 
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
    if (jScrollPane == null) {
    jScrollPane = new JScrollPane();
    }
    return jScrollPane;
    } /**
     * This method initializes jTextField
     * 
     * @return javax.swing.JTextField
     */
    private JTextField getJTextField() {
    if (jTextField == null) {
    jTextField = new JTextField();
    jTextField.setColumns(25);
    }
    return jTextField;
    } /**
     * This method initializes jButton
     * 
     * @return javax.swing.JButton
     */
    private JButton getJButton() {
    if (jButton == null) {
    jButton = new JButton();
    jButton.setText("发送");
    }
    return jButton;
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    ServerFrame thisClass = new ServerFrame();
    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisClass.setVisible(true);
    }
    });
    } /**
     * This is the default constructor
     */
    public ServerFrame() {
    super();
    initialize();
    stratServer();
    } private void stratServer() {
    jTextArea.setText("服务器已启动,正在监听8090端口...");
    // TODO Auto-generated method stub
    new Thread(new Runnable() {

    @Override
    public void run() {
    // TODO Auto-generated method stub
    ss = new Server(jTextArea,listModel);
    try {
    ss.startServer();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }).start();
    } /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
    this.setSize(443, 379);
    this.setContentPane(getJContentPane());
    this.setTitle("QQ服务器窗口");
    this.addWindowListener(new java.awt.event.WindowAdapter() {
    public void windowClosing(java.awt.event.WindowEvent e) {
    System.out.println("windowClosing()"); // TODO Auto-generated Event stub windowClosing()
    }
    });
    } /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
    if (jContentPane == null) {
    jLabel2 = new JLabel();
    jLabel2.setText("JLabel");
    jContentPane = new JPanel();
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJTextArea(), BorderLayout.CENTER);
    jContentPane.add(getJPanel1(), BorderLayout.EAST);
    jContentPane.add(getJPanel2(), BorderLayout.SOUTH);
    jContentPane.add(jLabel2, BorderLayout.NORTH);
    }
    return jContentPane;
    }}  //  @jve:decl-index=0:visual-constraint="10,10"
      

  4.   


    大二,你能写出来? 不然早就把问题说清楚了, 敢说不是copy的