package Server; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JList; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class ServerFrame extends JFrame implements ActionListener { private JButton jbt_start; private JButton jbt_stop; private JButton jbt_exit; private JTextArea jta_disMess; private JList jlt_disUsers; private Server server; public List<String> online_usernames; public List<Integer> online_usernameids; public ServerFrame(Server server) { this.server = server; online_usernames = new ArrayList<String>(); online_usernameids = new ArrayList<Integer>(); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } setTitle("u670Du52A1u5668"); setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg")); setSize(449, 301); setResizable(false); WinCenter.center(this); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent arg0) { jbt_exit.doClick(); } }); getContentPane().setLayout(null); jbt_start = new JButton("u542Fu52A8u670Du52A1u5668"); jbt_start.setBounds(32, 23, 103, 34); jbt_start.addActionListener(this); getContentPane().add(jbt_start); jbt_stop = new JButton("u505Cu6B62u670Du52A1u5668"); jbt_stop.setBounds(145, 23, 103, 34); jbt_stop.setEnabled(false); jbt_stop.addActionListener(this); getContentPane().add(jbt_stop); jbt_exit = new JButton("u9000u51FAu670Du52A1u5668"); jbt_exit.setBounds(258, 23, 103, 34); jbt_exit.addActionListener(this); getContentPane().add(jbt_exit); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 64, 221, 192); scrollPane.setWheelScrollingEnabled(true); scrollPane.setBorder(BorderFactory.createTitledBorder("聊天消息")); getContentPane().add(scrollPane); jta_disMess = new JTextArea(); scrollPane.setViewportView(jta_disMess); JScrollPane scrollPane_1 = new JScrollPane(); scrollPane_1.setBounds(258, 65, 157, 191); scrollPane_1.setBorder(BorderFactory.createTitledBorder("在线用户")); getContentPane().add(scrollPane_1); jlt_disUsers = new JList(); jlt_disUsers.setVisibleRowCount(4); scrollPane_1.setViewportView(jlt_disUsers); } /** * */ private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent arg0) { if (arg0.getSource() == jbt_start) { jbt_start.setEnabled(false); jbt_stop.setEnabled(true); server.startServer(); } if (arg0.getSource() == jbt_stop) { int flag = JOptionPane.showConfirmDialog(this, "是否要停止服务器?", "", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (flag == JOptionPane.OK_OPTION) { server.stopServer(); jbt_start.setEnabled(true); jbt_stop.setEnabled(false); } } if (arg0.getSource() == jbt_exit) { if (jbt_stop.isEnabled()) { jbt_stop.doClick(); } server.close(); } } public void setDisUsers(String userNames) { if (userNames.equals("@userlist")) { jlt_disUsers.removeAll(); String[] user_null = new String[]{}; jlt_disUsers.setListData(user_null); } else { if (userNames.contains("@userlist")) { String[] dis = userNames.split("@userlist"); String[] disUsernames = new String[dis.length / 2]; int j = 0; for (int i = 0; i < dis.length; i++) { disUsernames[j++] = dis[i++]; } jlt_disUsers.removeAll(); jlt_disUsers.setListData(disUsernames); } if (userNames.contains("@exit")) { String[] dis = {}; jlt_disUsers.setListData(dis); } } } public void setDisMess(String message) { if (message.contains("@chat")) { int local = message.indexOf("@chat"); jta_disMess.append(message.substring(0, local) + "n"); jta_disMess.setCaretPosition(jta_disMess.getText().length()); } if (message.contains("@exit")) { jta_disMess.setText(""); } } public void setStartAndStopUnable() { JOptionPane.showMessageDialog(this, "不能同时开启两个服务器"); jbt_start.setEnabled(false); jbt_stop.setEnabled(false); } }
设置窗口居中代码:
package Server; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.Window; public class WinCenter { public static void center(Window win) { Toolkit tkit = Toolkit.getDefaultToolkit(); Dimension sSize = tkit.getScreenSize(); Dimension wSize = win.getSize(); if (wSize.height > sSize.height) { wSize.height = sSize.height; } if (wSize.width > sSize.width) { wSize.width = sSize.width; } win.setLocation((sSize.width - wSize.width) / 2, (sSize.height - wSize.height) / 2); } }
登录界面
package Client; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.Inet4Address; import java.net.UnknownHostException; import javax.swing.JTextField; import javax.swing.JButton; public class Client_enterFrame extends JFrame implements ActionListener, KeyListener { public Client_enterFrame(Client client) { this.client = client; try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (UnsupportedLookAndFeelException e1) { e1.printStackTrace(); } setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg")); setTitle("u804Au5929u5BA4"); getContentPane().setLayout(null); setSize(296, 249); WinCenter.center(this); setResizable(false); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { jbt_exit.doClick(); } }); JLabel lblNewLabel = new JLabel("u7528u6237u540D"); lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 14)); lblNewLabel.setBounds(23, 30, 81, 34); getContentPane().add(lblNewLabel); jtf_username = new JTextField(); jtf_username.addKeyListener(this); jtf_username.setBounds(114, 30, 143, 34); getContentPane().add(jtf_username); jtf_username.setColumns(10); JLabel lblNewLabel_1 = new JLabel("u670Du52A1u5668u5730u5740"); lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 14)); lblNewLabel_1.setBounds(23, 74, 81, 34); getContentPane().add(lblNewLabel_1); jtf_hostIp = new JTextField(); jtf_hostIp.setBounds(114, 74, 143, 34); jtf_hostIp.addKeyListener(this); getContentPane().add(jtf_hostIp); try { String ip = (String) Inet4Address.getLocalHost().getHostAddress(); jtf_hostIp.setText(ip); } catch (UnknownHostException e) { e.printStackTrace(); } jtf_hostIp.setColumns(10); JLabel lblNewLabel_2 = new JLabel("u7AEFu53E3u53F7"); lblNewLabel_2.setFont(new Font("宋体", Font.PLAIN, 14)); lblNewLabel_2.setBounds(23, 118, 81, 34); getContentPane().add(lblNewLabel_2); jtf_hostPort = new JTextField(); jtf_hostPort.addKeyListener(this); jtf_hostPort.setBounds(114, 118, 143, 34); getContentPane().add(jtf_hostPort); jtf_hostPort.setText("5000"); jtf_hostPort.setColumns(10); jbt_enter = new JButton("u8FDBu5165u804Au5929u5BA4"); jbt_enter.addActionListener(this); jbt_enter.addKeyListener(this); jbt_enter.setFont(new Font("宋体", Font.PLAIN, 14)); jbt_enter.setBounds(23, 162, 108, 39); getContentPane().add(jbt_enter); jbt_exit = new JButton("u9000u51FAu804Au5929u5BA4"); jbt_exit.setFont(new Font("宋体", Font.PLAIN, 14)); jbt_exit.setBounds(144, 162, 113, 39); jbt_exit.addActionListener(this); getContentPane().add(jbt_exit); } /** * */ private static final long serialVersionUID = 1L; private JTextField jtf_username; private JTextField jtf_hostIp; private JTextField jtf_hostPort; private JButton jbt_enter; private JButton jbt_exit; private Client client; @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == jbt_exit) { setVisible(false); client.exitLogin(); } if (e.getSource() == jbt_enter) { String username = jtf_username.getText(); username.trim(); String hostIp = jtf_hostIp.getText(); hostIp.trim(); String hostPort = jtf_hostPort.getText(); hostPort.trim(); if (!username.equals("")) { if (!hostIp.equals("")) { if (!hostPort.equals("")) { String login_mess = client.login(username, hostIp, hostPort); if (login_mess.equals("true")) { this.setVisible(false); client.showChatFrame(username); } else { JOptionPane.showMessageDialog(this, login_mess); } } else { JOptionPane.showMessageDialog(this, "服务器连接端口号不能为空!"); } } else { JOptionPane.showMessageDialog(this, "服务器地址不能为空!"); } } else { JOptionPane.showMessageDialog(this, "用户名不能为空!"); } } } @Override public void keyPressed(KeyEvent arg0) { if (arg0.getKeyCode() == KeyEvent.VK_ENTER) { jbt_enter.doClick(); } } @Override public void keyReleased(KeyEvent arg0) { } @Override public void keyTyped(KeyEvent arg0) { } }
聊天主界面
package Client; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class Client_chatFrame extends JFrame implements ActionListener, KeyListener, ListSelectionListener { public Client_chatFrame(Client client, String title) { this.client = client; try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg")); setTitle("u804Au5929u5BA4" + " " + title); setSize(450, 325); WinCenter.center(this); setResizable(false); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent arg0) { jbt_exit.doClick(); } }); getContentPane().setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBorder(BorderFactory.createTitledBorder("聊天消息")); scrollPane.setBounds(10, 10, 283, 167); scrollPane.setWheelScrollingEnabled(true); getContentPane().add(scrollPane); jta_disMess = new JTextArea(); jta_disMess.setEditable(false); scrollPane.setViewportView(jta_disMess); jtf_inputMess = new JTextField(); jtf_inputMess.addKeyListener(this); jtf_inputMess.setBounds(10, 242, 192, 32); getContentPane().add(jtf_inputMess); jtf_inputMess.setColumns(10); jbt_trans = new JButton("u53D1 u9001"); jbt_trans.setFont(new Font("宋体", Font.PLAIN, 14)); jbt_trans.setBounds(212, 241, 93, 32); jbt_trans.addActionListener(this); getContentPane().add(jbt_trans); jbt_clear = new JButton("u6E05u9664u804Au5929u8BB0u5F55"); jbt_clear.setFont(new Font("宋体", Font.PLAIN, 14)); jbt_clear.setBounds(158, 187, 135, 37); jbt_clear.addActionListener(this); getContentPane().add(jbt_clear); jbt_exit = new JButton("u9000u51FAu804Au5929u5BA4"); jbt_exit.setFont(new Font("宋体", Font.PLAIN, 14)); jbt_exit.setBounds(20, 189, 128, 37); jbt_exit.addActionListener(this); getContentPane().add(jbt_exit); scrollPane_1 = new JScrollPane(); scrollPane_1.setBorder(BorderFactory.createTitledBorder("在线用户")); scrollPane_1.setBounds(303, 10, 128, 214); getContentPane().add(scrollPane_1); jlt_disUsers = new JList(); jlt_disUsers.setVisibleRowCount(4); jlt_disUsers.setSelectedIndex(0); jlt_disUsers .setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); jlt_disUsers.addListSelectionListener(this); scrollPane_1.setViewportView(jlt_disUsers); jbt_singlChat = new JButton("u5355u4EBAu804Au5929"); jbt_singlChat.setBounds(315, 241, 116, 32); jbt_singlChat.addActionListener(this); getContentPane().add(jbt_singlChat); } /** * */ private static final long serialVersionUID = 1L; private JTextField jtf_inputMess; private JTextArea jta_disMess; private JButton jbt_trans; private JButton jbt_clear; private JButton jbt_exit; private JList jlt_disUsers; private JButton jbt_singlChat; private JScrollPane scrollPane_1; private Client client; @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == jbt_clear) { jta_disMess.setText(""); } if (e.getSource() == jbt_trans) { String mess = jtf_inputMess.getText(); mess.trim(); jtf_inputMess.setText(""); if (mess.equals("")) { JOptionPane.showMessageDialog(this, "不能发送空消息"); jtf_inputMess.setText(""); } else { client.transMess(mess); } } if (e.getSource() == jbt_exit) { if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this, "是否确定要退出聊天室?", "提示", JOptionPane.OK_CANCEL_OPTION)) { this.setVisible(false); client.exitChat(); System.exit(0); } } if (e.getSource() == jbt_singlChat) { String user_names = (String) jlt_disUsers.getSelectedValue(); if (user_names == null) { JOptionPane.showMessageDialog(this, "您未选择聊天对象n请选择要单独聊天的对象"); } else { if (!client.c_singleFrames.containsKey(user_names)) { createSingleChatFrame(user_names); } else { client.c_singleFrames.get(user_names) .setFocusableWindowState(true); } } } } @Override public void keyPressed(KeyEvent arg0) { if (arg0.getKeyCode() == KeyEvent.VK_ENTER) { if (arg0.getSource() == jtf_inputMess) { jbt_trans.doClick(); } } } @Override public void keyReleased(KeyEvent arg0) { } @Override public void keyTyped(KeyEvent arg0) { } public void setDisMess(String substring) { int local = substring.indexOf("@chat"); jta_disMess.append(substring.substring(0, local) + "n"); jta_disMess.setCaretPosition(jta_disMess.getText().length()); } public void setDisUsers(String chat_re) { String[] infos = chat_re.split("@userlist"); String[] info = new String[infos.length / 2]; for (int i = 1; i < infos.length; i++) { int id_user = 0; try { id_user = Integer.parseInt(infos[i]); if (client.getThreadID() == id_user) { if (!client.username.equals(infos[i - 1])) { JOptionPane.showMessageDialog(this, "由于有同名的用户登录,所以您的用户名后面加上了编号"); client.username = infos[i - 1]; this.setTitle("聊天室 " + client.username); break; } else { break; } } else { i++; } } catch (Exception e) { &nbs