




免费预览已结束,剩余40页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Server代码Bean 类package Server;import .Socket;import java.io.Serializable;import java.util.HashMap;import java.util.HashSet;public class Bean implements Serializableprivate 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) = info;public String getTimer() return timer;public void setTimer(String timer) this.timer = timer;public String getName() return name;public void setName(String 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) = 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 blocke.printStackTrace();class CatClientThread extends Thread private Socket client;private Bean bean;private ObjectInputStream ois;private ObjectOutputStream oos;public CatClientThread(Socket client) this.client = client;Overridepublic 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 blocke.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 blocke.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); finally close();/ 向选中的用户发送数据private void sendMessage(Bean serverBean) /已经获取了接收方的信息并储存在本地/ 首先取得所有的valuesSet cbs = onlines.keySet();/存有所有的客户信息Iterator it = cbs.iterator();/遍历所有的客户/ 选中客户HashSet clients = serverBean.getClients();/进行判断是否为接收方,因为可以选择一个或多个while (it.hasNext() / 在线客户String client = it.next();/ 选中的客户中若是在线的,就发送serverbeanif (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 blocke.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 blocke.printStackTrace();private void close() if (oos != null) try oos.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();if (ois != null) try ois.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();if (client != null) try client.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();public void start() try while (true) Socket client = ss.accept();new CatClientThread(client).start(); catch (IOException e) / TODO Auto-generated catch blocke.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 Serializableprivate 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) = info;public String getTimer() return timer;public void setTimer(String timer) this.timer = timer;public String getName() return name;public void setName(String 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 AbstractListModelprivate Vector vs;/*私有一个向量对象,可以防止两个或多个线程同时访问某个向量时引起的数量破坏*/public UUListModel(Vector vs)/内部类构造方法this.vs = vs;/*获得元素的下标, * 即是元素所处的位置*/public Object getElementAt(int index) / TODO Auto-generated method stubreturn vs.get(index);Overridepublic int getSize() / TODO Auto-generated method stubreturn 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 blocke1.printStackTrace(); catch (InstantiationException e1) / TODO Auto-generated catch blocke1.printStackTrace(); catch (IllegalAccessException e1) / TODO Auto-generated catch blocke1.printStackTrace(); catch (UnsupportedLookAndFeelException e1) / TODO Auto-generated catch blocke1.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;Overrideprotected 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(u5173u95ED);btnNewButton.setBounds(214, 448, 60, 30);getContentPane().add(btnNewButton);/ 发送按钮JButton btnNewButton_1 = new JButton(u53D1u9001);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, + 在线客户:, 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(u6587u4EF6u4F20u9001u4FE1u606Fu680F:);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 blocke.printStackTrace();/ 发送按钮btnNewButton_1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) String info = textArea_1.getText();List to = list.getSelectedValuesList();/选择列表条目if (to.s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 转移性胃癌治疗胃癌诊疗指南解读试题(附答案)
- 数字化物流商业运营 习题答案-模块4
- 2025年物流运输职业技能实务操作知识考试题库与答案
- 2025年叉车司机车辆基本操作知识考试题库及答案
- 树叶上的秘密课件
- 2025院感试题及答案
- 标准化基础知识培训目的课件
- 深圳独栋度假别墅室内设计方案
- 化肥厂员工安全培训知识课件
- 医嘱查对制度试题(带答案)
- 校园突发事件与应急管理
- 多重耐药菌感染的预防与控制优秀课件
- 商铺销售基础知识培训.(太全了)
- SH/T 0316-1998石油密度计技术条件
- GA 1301-2016火灾原因认定规则
- 质量控制计划
- TTT培训师培训课件(-)
- 学校学生健康体检知识培训课件
- 常用分析质量控制图课件
- 医疗、预防、保健机构的拟聘用证明
- 经颈静脉肝内门体分流术(TIPS)的护理课件
评论
0/150
提交评论