Server代码Bean 类package Server;import .Socket;import java.io.Serializable;import java.util.HashMap;import java.util.HashSet;public class Bean implements Serializable{ private int type; // 1私聊 0上下线更新 -1下线请求 2请求发送文件 3.确定接收文件 private HashSet clients; // 存放选中的客户 private HashSet to; public HashMap onlines; private String info; private String timer; private String name; private String fileName; private int size; private String ip; private int port; public int getType() { return type; } public void setType(int type) { this.type = type; } public HashSet getClients() { return clients; } public void setClients(HashSet clients) { this.clients = clients; } public HashSet getTo() { return to; } public void setTo(HashSet to) { this.to = to; } public HashMap getOnlines() { return onlines; } public void setOnlines(HashMap onlines) { this.onlines = onlines; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public String getTimer() { return timer; } public void setTimer(String timer) { this.timer = timer; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public int getPort() { return port; } public void setPort(int port) { this.port = port; }}Clientbean类package Server;import .Socket;public class ClientBean { private String name; private Socket socket; public String getName() { return name; } public void setName(String name) { this.name = name; } public Socket getSocket() { return socket; } public void setSocket(Socket socket) { this.socket = socket; }}Server类package Server;import java.io.*;import .*;import java.util.*;import Client.Bean;import Client.ClientBean;public class Server { private static ServerSocket ss; public static HashMap onlines; static { try { ss = new ServerSocket(8520); onlines = new HashMap(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class CatClientThread extends Thread { private Socket client; private Bean bean; private ObjectInputStream ois; private ObjectOutputStream oos; public CatClientThread(Socket client) { this.client = client; } @Override public void run() { try { // 不停的从客户端接收信息 while (true) { // 读取从客户端接收到的bean信息 ois = new ObjectInputStream(client.getInputStream()); bean = (Bean)ois.readObject(); // 分析bean中,type是那样一种类型 switch (bean.getType()) { // 上下线更新 case 0: { // 上线 // 记录上线客户的用户名和端口在clientbean中 ClientBean cbean = new ClientBean(); cbean.setName(bean.getName()); cbean.setSocket(client); // 添加在线用户 onlines.put(bean.getName(), cbean); // 创建服务器的bean,并发送给客户端 Bean serverBean = new Bean(); serverBean.setType(0); serverBean.setInfo(bean.getTimer() + " " + bean.getName() + "上线了"); // 通知所有客户有人上线 HashSet set = new HashSet(); // 客户昵称 set.addAll(onlines.keySet()); serverBean.setClients(set); sendAll(serverBean); break; } case -1: { // 下线 // 创建服务器的catbean,并发送给客户端 Bean serverBean = new Bean(); serverBean.setType(-1); try { oos = new ObjectOutputStream( client.getOutputStream()); oos.writeObject(serverBean); oos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } onlines.remove(bean.getName()); // 向剩下的在线用户发送有人离开的通知 Bean serverBean2 = new Bean(); serverBean2.setInfo(bean.getTimer() + " " + bean.getName() + " " + " 下线了"); serverBean2.setType(0); HashSet set = new HashSet(); set.addAll(onlines.keySet()); serverBean2.setClients(set); sendAll(serverBean2); return; } case 1: { // 聊天 // 创建服务器的catbean,并发送给客户端 Bean serverBean = new Bean(); serverBean.setType(1); serverBean.setClients(bean.getClients()); serverBean.setInfo(bean.getInfo()); serverBean.setName(bean.getName());//接收方的名称 serverBean.setTimer(bean.getTimer()); // 向选中的客户发送数据 sendMessage(serverBean); break; } case 2: { // 请求接受文件 // 创建服务器的catbean,并发送给客户端 Bean serverBean = new Bean(); String info = bean.getTimer() + " " + bean.getName() + "向你传送文件,是否需要接受"; serverBean.setType(2); serverBean.setClients(bean.getClients()); // 这是发送的目的地 serverBean.setFileName(bean.getFileName()); // 文件名称 serverBean.setSize(bean.getSize()); // 文件大小 serverBean.setInfo(info); serverBean.setName(bean.getName()); // 来源 serverBean.setTimer(bean.getTimer()); // 向选中的客户发送数据 sendMessage(serverBean); break; } case 3: { // 确定接收文件 Bean serverBean = new Bean(); serverBean.setType(3); serverBean.setClients(bean.getClients()); // 文件来源 serverBean.setTo(bean.getTo()); // 文件目的地 serverBean.setFileName(bean.getFileName()); // 文件名称 serverBean.setIp(bean.getIp()); serverBean.setPort(bean.getPort()); serverBean.setName(bean.getName()); // 接收的客户名称 serverBean.setTimer(bean.getTimer()); // 通知文件来源的客户,对方确定接收文件 sendMessage(serverBean); break; } case 4: { Bean serverBean = new Bean(); serverBean.setType(4); serverBean.setClients(bean.getClients()); // 文件来源 serverBean.setTo(bean.getTo()); // 文件目的地 serverBean.setFileName(bean.getFileName()); serverBean.setInfo(bean.getInfo()); serverBean.setName(bean.getName());// 接收的客户名称 serverBean.setTimer(bean.getTimer()); sendMessage(serverBean); break; } default: { break; } } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(); } } // 向选中的用户发送数据 private void sendMessage(Bean serverBean) {//已经获取了接收方的信息并储存在本地 // 首先取得所有的values Set cbs = onlines.keySet();//存有所有的客户信息 Iterator it = cbs.iterator();//遍历所有的客户 // 选中客户 HashSet clients = serverBean.getClients();//进行判断是否为接收方,因为可以选择一个或多个 while (it.hasNext()) { // 在线客户 String client = it.next(); // 选中的客户中若是在线的,就发送serverbean if (clients.contains(client)) { Socket c = onlines.get(client).getSocket(); ObjectOutputStream oos; try { oos = new ObjectOutputStream(c.getOutputStream()); oos.writeObject(serverBean); oos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } // 向所有的用户发送数据 public void sendAll(Bean serverBean) { Collection clients = onlines.values(); Iterator it = clients.iterator(); ObjectOutputStream oos; while (it.hasNext()) { Socket c = it.next().getSocket(); try { oos = new ObjectOutputStream(c.getOutputStream()); oos.writeObject(serverBean); oos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void close() { if (oos != null) { try { oos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (ois != null) { try { ois.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (client != null) { try { client.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public void start() { try { while (true) { Socket client = ss.accept(); new CatClientThread(client).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { new Server().start(); }}Client代码bean类package Client;import java.io.Serializable;import java.util.HashMap;import java.util.HashSet;/*借鉴并参考了发送和接收对象*/@SuppressWarnings({ "serial", "unused" })public class Bean implements Serializable{ private int type; // 1私聊 0上下线更新 -1下线请求 2请求发送文件 3.确定接收文件 private HashSet clients; // 存放选中的客户 private HashSet to; public HashMap onlines; private String info; private String timer; private String name; private String fileName; private int size; private String ip; private int port; public int getType() { return type; } public void setType(int type) { this.type = type; } public HashSet getClients() { return clients; } public void setClients(HashSet clients) { this.clients = clients; } public HashSet getTo() { return to; } public void setTo(HashSet to) { this.to = to; } public HashMap getOnlines() { return onlines; } public void setOnlines(HashMap onlines) { this.onlines = onlines; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public String getTimer() { return timer; } public void setTimer(String timer) { this.timer = timer; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public int getPort() { return port; } public void setPort(int port) { this.port = port; }}Chatroom类package Client;//聊天界面以及处理信息的功能;import java.applet.Applet;import java.applet.AudioClip;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import java.util.*;import java.util.List;import javax.swing.*;import javax.swing.border.*;@SuppressWarnings({ "serial", "rawtypes" }) class CellRenderer extends JLabel implements ListCellRenderer {//列表框绘制器 CellRenderer() {//构造方法 setOpaque(true); } /*列表框 * 单元格 * 绘制器*/ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));// 加入宽度为5的空白边框 if (value != null) { setText(value.toString()); setIcon(new ImageIcon("images//1.jpg")); } if (isSelected) { setBackground(new Color(255, 255, 153));// 设置背景色 setForeground(Color.black); } else { // 设置选取与取消选取的前景与背景颜色. setBackground(Color.white); // 设置背景色 setForeground(Color.black); } setEnabled(list.isEnabled()); setFont(new Font("sdf", Font.ROMAN_BASELINE, 13)); setOpaque(true);//透明度 return this; }}/*内部类 * 继承了抽象列表模型 * */@SuppressWarnings({ "serial", "rawtypes" })class UUListModel extends AbstractListModel{ private Vector vs;/*私有一个向量对象,可以防止两个或多个线程同时访问某个向量时引起的数量破坏*/ public UUListModel(Vector vs){//内部类构造方法 this.vs = vs; } /*获得元素的下标, * 即是元素所处的位置*/ public Object getElementAt(int index) { // TODO Auto-generated method stub return vs.get(index); } @Override public int getSize() { // TODO Auto-generated method stub return vs.size(); }}public class Chatroom extends JFrame { private static final long serialVersionUID = 6129126482250125466L; private static JPanel contentPane; private static Socket clientSocket; private static ObjectOutputStream oos; private static ObjectInputStream ois; private static String name; private static JTextArea textArea; @SuppressWarnings("rawtypes") private static AbstractListModel listmodel; @SuppressWarnings("rawtypes") private static JList list; private static String filePath; private static JLabel lblNewLabel; private static JProgressBar progressBar; @SuppressWarnings("rawtypes") private static Vector onlines; private static boolean isSendFile = false; private static boolean isReceiveFile = false; // 声音 private static File file, file2; private static URL cb, cb2; private static AudioClip aau, aau2;//声音 /** * Create the frame. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public Chatroom(String u_name, Socket client) { // 赋值 name = u_name; clientSocket = client; onlines = new Vector(); SwingUtilities.updateComponentTreeUI(this); try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (InstantiationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (UnsupportedLookAndFeelException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } setTitle(name); setResizable(false); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setBounds(200, 100, 688, 510); contentPane = new JPanel() { private static final long serialVersionUID = 1L; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(new ImageIcon("images\\聊天室1.jpg").getImage(), 0, 0, getWidth(), getHeight(), null); } }; setContentPane(contentPane); contentPane.setLayout(null); // 聊天信息显示区域 JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 10, 410, 300); getContentPane().add(scrollPane); textArea = new JTextArea(); textArea.setEditable(false); textArea.setLineWrap(true);//激活自动换行功能 textArea.setWrapStyleWord(true);//激活断行不断字功能 textArea.setFont(new Font("sdf", Font.BOLD, 13)); scrollPane.setViewportView(textArea); // 打字区域 JScrollPane scrollPane_1 = new JScrollPane(); scrollPane_1.setBounds(10, 347, 411, 97); getContentPane().add(scrollPane_1); final JTextArea textArea_1 = new JTextArea(); textArea_1.setLineWrap(true);//激活自动换行功能 textArea_1.setWrapStyleWord(true);//激活断行不断字功能 scrollPane_1.setViewportView(textArea_1); // 关闭按钮 final JButton btnNewButton = new JButton("\u5173\u95ED"); btnNewButton.setBounds(214, 448, 60, 30); getContentPane().add(btnNewButton); // 发送按钮 JButton btnNewButton_1 = new JButton("\u53D1\u9001"); btnNewButton_1.setBounds(313, 448, 60, 30); getRootPane().setDefaultButton(btnNewButton_1); getContentPane().add(btnNewButton_1); // 在线客户列表 listmodel = new UUListModel(onlines) ; list = new JList(listmodel); list.setCellRenderer(new CellRenderer()); list.setOpaque(false); Border etch = BorderFactory.createEtchedBorder(); list.setBorder(BorderFactory.createTitledBorder(etch, "<"+u_name+">" + "在线客户:", TitledBorder.LEADING, TitledBorder.TOP, new Font( "sdf", Font.BOLD, 20), Color.green)); JScrollPane scrollPane_2 = new JScrollPane(list); scrollPane_2.setBounds(430,10,245,375); scrollPane_2.setOpaque(false); scrollPane_2.getViewport().setOpaque(false); getContentPane().add(scrollPane_2); // 文件传输栏 progressBar = new JProgressBar(); progressBar.setBounds(430, 390, 245, 15); progressBar.setMinimum(1); progressBar.setMaximum(100); getContentPane().add(progressBar); // 文件传输提示 lblNewLabel = new JLabel( "\u6587\u4EF6\u4F20\u9001\u4FE1\u606F\u680F:"); lblNewLabel.setFont(new Font("SimSun", Font.PLAIN, 12)); lblNewLabel.setBackground(Color.WHITE); lblNewLabel.setBounds(430, 410, 245, 15); getContentPane().add(lblNewLabel); try { oos = new ObjectOutputStream(clientSocket.getOutputStream()); // 记录上线客户的信息在bean中,并发送给服务器 Bean bean = new Bean(); bean.setType(0); bean.setName(name); bean.setTimer(Util.getTimer()); oos.writeObject(bean); oos.flush(); // 消息提示声音 file = new File("sounds\\呃欧.wav"); cb = file.toURL(); aau = Applet.newAudioClip(cb); // 上线提示声音 file2 = new File("sounds\\叮.wav"); cb2 = file2.toURL(); aau2 = Applet.newAudioClip(cb2); // 启动客户接收线程 new ClientInputThread().start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 发送按钮 btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String info = textArea_1.getText(); List to = list.getSelectedValuesList();//选择列表条目 if (to.size() < 1) { JOptionPane.showMessageDialog(getContentPane(), "请选择聊天对象"); return; } if (to.toString().contains(name+"(我)")) { JOptionPane .showMessageDialog(getContentPane(), "不能向自己发送信息"); return; } if (info.equals("")) { JOptionPane.showMessageDialog(getContentPane(), "不能发送空信息"); return; } Bean clientBean = new Bean(); clientBean.setType(1);// clientBean.setName(name); String time = Util.getTimer(); clientBean.setTimer(time); clientBean.setInfo(info); HashSet set = new HashSet(); set.addAll(to); clientBean.setClients(set); // 自己发的内容也要现实在自己的屏幕上面 textArea.append(time + " 我对" + to + "说:\r\n" + info + "\r\n"); sendMessage(clientBean); textArea_1.setText(null); textArea_1.requestFocus(); } }); // 关闭按钮 btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(isSendFile || isReceiveFile){ JOptionPane.showMessageDialog(contentPane, "正在传输文件中,您不能离开...", "Error Message", JOptionPane.ERROR_MESSAGE); }else{ btnNewButton.setEnabled(false); Bean clientBean = new Bean(); clientBean.setType(-1); clientBean.setName(name); clientBean.setTimer(Util.getTimer()); sendMessage(clientBean); } } }); // 离开 this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub if(isSendFile || isReceiveFile){ JOptionPane.showMessageDialog(contentPane, "正在传输文件中,您不能离开...", "Error Message", JOptionPane.ERROR_MESSAGE); }else{ int result = JOptionPane.showConfirmDialog(getContentPane(), "您确定要离开聊天室"); if (result == 0) { Bean clientBean = new Bean(); clientBean.setType(-1); clientBean.setName(name); clientBean.setTimer(Util.getTimer()); sendMessage(clientBean); } } } }); // 列表监听 list.add。