实例介绍
【实例简介】没有数据库,打开直接运行即可
【实例截图】
【核心代码】
package cat.client; import java.applet.Applet; import java.applet.AudioClip; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.AbstractListModel; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.ListCellRenderer; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import cat.function.CatBean; import cat.util.CatUtil; 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; } } class UUListModel extends AbstractListModel{ private Vector vs; public UUListModel(Vector vs){ this.vs = vs; } @Override 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 CatChatroom 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; private static AbstractListModel listmodel; private static JList list; private static String filePath; private static JLabel lblNewLabel; private static JProgressBar progressBar; 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. */ public CatChatroom(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()); // 记录上线客户的信息在catbean中,并发送给服务器 CatBean bean = new CatBean(); bean.setType(0); bean.setName(name); bean.setTimer(CatUtil.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; } CatBean clientBean = new CatBean(); clientBean.setType(1); clientBean.setName(name); String time = CatUtil.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); CatBean clientBean = new CatBean(); clientBean.setType(-1); clientBean.setName(name); clientBean.setTimer(CatUtil.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) { CatBean clientBean = new CatBean(); clientBean.setType(-1); clientBean.setName(name); clientBean.setTimer(CatUtil.getTimer()); sendMessage(clientBean); } } } }); // 列表监听 list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { List to = list.getSelectedValuesList(); if (e.getClickCount() == 2) { if (to.toString().contains(name "(我)")) { JOptionPane .showMessageDialog(getContentPane(), "不能向自己发送文件"); return; } // 双击打开文件文件选择框 JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("选择文件框"); // 标题哦... chooser.showDialog(getContentPane(), "选择"); // 这是按钮的名字.. // 判定是否选择了文件 if (chooser.getSelectedFile() != null) { // 获取路径 filePath = chooser.getSelectedFile().getPath(); File file = new File(filePath); // 文件为空 if (file.length() == 0) { JOptionPane.showMessageDialog(getContentPane(), filePath "文件为空,不允许发送."); return; } CatBean clientBean = new CatBean(); clientBean.setType(2);// 请求发送文件 clientBean.setSize(new Long(file.length()).intValue()); clientBean.setName(name); clientBean.setTimer(CatUtil.getTimer()); clientBean.setFileName(file.getName()); // 记录文件的名称 clientBean.setInfo("请求发送文件"); // 判断要发送给谁 HashSet<String> set = new HashSet<String>(); set.addAll(list.getSelectedValuesList()); clientBean.setClients(set); sendMessage(clientBean); } } } }); } class ClientInputThread extends Thread { @Override public void run() { try { // 不停的从服务器接收信息 while (true) { ois = new ObjectInputStream(clientSocket.getInputStream()); final CatBean bean = (CatBean) ois.readObject(); switch (bean.getType()) { case 0: { // 更新列表 onlines.clear(); HashSet<String> clients = bean.getClients(); Iterator<String> it = clients.iterator(); while (it.hasNext()) { String ele = it.next(); if (name.equals(ele)) { onlines.add(ele "(我)"); } else { onlines.add(ele); } } listmodel = new UUListModel(onlines); list.setModel(listmodel); aau2.play(); textArea.append(bean.getInfo() "\r\n"); textArea.selectAll(); break; } case -1: { return; } case 1: { String info = bean.getTimer() " " bean.getName() " 对 " bean.getClients() "说:\r\n"; if (info.contains(name) ) { info = info.replace(name, "我"); } aau.play(); textArea.append(info bean.getInfo() "\r\n"); textArea.selectAll(); break; } case 2: { // 由于等待目标客户确认是否接收文件是个阻塞状态,所以这里用线程处理 new Thread(){ public void run() { //显示是否接收文件对话框 int result = JOptionPane.showConfirmDialog( getContentPane(), bean.getInfo()); switch(result){ case 0:{ //接收文件 JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("保存文件框"); // 标题哦... //默认文件名称还有放在当前目录下 chooser.setSelectedFile(new File(bean .getFileName())); chooser.showDialog(getContentPane(), "保存"); // 这是按钮的名字.. //保存路径 String saveFilePath =chooser.getSelectedFile().toString(); //创建客户CatBean CatBean clientBean = new CatBean(); clientBean.setType(3); clientBean.setName(name); //接收文件的客户名字 clientBean.setTimer(CatUtil.getTimer()); clientBean.setFileName(saveFilePath); clientBean.setInfo("确定接收文件"); // 判断要发送给谁 HashSet<String> set = new HashSet<String>(); set.add(bean.getName()); clientBean.setClients(set); //文件来源 clientBean.setTo(bean.getClients());//给这些客户发送文件 // 创建新的tcp socket 接收数据, 这是额外增加的功能, 大家请留意... try { ServerSocket ss = new ServerSocket(0); // 0可以获取空闲的端口号 clientBean.setIp(clientSocket.getInetAddress().getHostAddress()); clientBean.setPort(ss.getLocalPort()); sendMessage(clientBean); // 先通过服务器告诉发送方, 你可以直接发送文件到我这里了... isReceiveFile=true; //等待文件来源的客户,输送文件....目标客户从网络上读取文件,并写在本地上 Socket sk = ss.accept(); textArea.append(CatUtil.getTimer() " " bean.getFileName() "文件保存中.\r\n"); DataInputStream dis = new DataInputStream( //从网络上读取文件 new BufferedInputStream(sk.getInputStream())); DataOutputStream dos = new DataOutputStream( //写在本地上 new BufferedOutputStream(new FileOutputStream( saveFilePath))); int count = 0; int num = bean.getSize() / 100; int index = 0; while (count < bean.getSize()) { int t = dis.read(); dos.write(t); count ; if(num>0){ if (count % num == 0 && index < 100) { progressBar.setValue( index); } lblNewLabel.setText("下载进度:" count "/" bean.getSize() " 整体" index "%"); }else{ lblNewLabel.setText("下载进度:" count "/" bean.getSize() " 整体:" new Double(new Double(count).doubleValue()/new Double(bean.getSize()).doubleValue()*100).intValue() "%"); if(count==bean.getSize()){ progressBar.setValue(100); } } } //给文件来源客户发条提示,文件保存完毕 PrintWriter out = new PrintWriter(sk.getOutputStream(),true); out.println(CatUtil.getTimer() " 发送给" name "的文件[" bean.getFileName() "]" "文件保存完毕.\r\n"); out.flush(); dos.flush(); dos.close(); out.close(); dis.close(); sk.close(); ss.close(); textArea.append(CatUtil.getTimer() " " bean.getFileName() "文件保存完毕.存放位置为:" saveFilePath "\r\n"); isReceiveFile = false; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } default: { CatBean clientBean = new CatBean(); clientBean.setType(4); clientBean.setName(name); //接收文件的客户名字 clientBean.setTimer(CatUtil.getTimer()); clientBean.setFileName(bean.getFileName()); clientBean.setInfo(CatUtil.getTimer() " " name "取消接收文件[" bean.getFileName() "]"); // 判断要发送给谁 HashSet<String> set = new HashSet<String>(); set.add(bean.getName()); clientBean.setClients(set); //文件来源 clientBean.setTo(bean.getClients());//给这些客户发送文件 sendMessage(clientBean); break; } } }; }.start(); break; } case 3: { //目标客户愿意接收文件,源客户开始读取本地文件并发送到网络上 textArea.append(bean.getTimer() " " bean.getName() "确定接收文件" ",文件传送中..\r\n"); new Thread(){ public void run() { try { isSendFile = true; //创建要接收文件的客户套接字 Socket s = new Socket(bean.getIp(),bean.getPort()); DataInputStream dis = new DataInputStream( new FileInputStream(filePath)); //本地读取该客户刚才选中的文件 DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(s .getOutputStream())); //网络写出文件 int size = dis.available(); int count = 0; //读取次数 int num = size / 100; int index = 0; while (count < size) { int t = dis.read(); dos.write(t); count ; //每次只读取一个字节 if(num>0){ if (count % num == 0 && index < 100) { progressBar.setValue( index); } lblNewLabel.setText("上传进度:" count "/" size " 整体" index "%"); }else{ lblNewLabel.setText("上传进度:" count "/" size " 整体:" new Double(new Double(count).doubleValue()/new Double(size).doubleValue()*100).intValue() "%" ); if(count==size){ progressBar.setValue(100); } } } dos.flush(); dis.close(); //读取目标客户的提示保存完毕的信息... BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); textArea.append( br.readLine() "\r\n"); isSendFile = false; br.close(); s.close(); } catch (Exception ex) { ex.printStackTrace(); } }; }.start(); break; } case 4: { textArea.append(bean.getInfo() "\r\n"); break; } default: { break; } } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (clientSocket != null) { try { clientSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.exit(0); } } } private void sendMessage(CatBean clientBean) { try { oos = new ObjectOutputStream(clientSocket.getOutputStream()); oos.writeObject(clientBean); oos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)