⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recievethread.java

📁 用java开发的QQ管理系统
💻 JAVA
字号:
package com.zlf.qqclient.login;

/**
 *客户端接收线程
 *@author zlf
 */
import java.awt.Color;
import java.awt.Component;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.tree.DefaultMutableTreeNode;

import com.zlf.qq.pub.DataPacket;
import com.zlf.qqclient.filetransfer.FileTransfer;
import com.zlf.qqclient.filetransfer.MyFileChooser;
import com.zlf.qqclient.filetransfer.ReceiveFile;
import com.zlf.qqclient.mainframe.MainFrame;
import com.zlf.qqclient.mainframe.tree.User;
import com.zlf.qqclient.utils.Public;
import com.zlf.qqclient.utils.QQUtils;

public class RecieveThread implements Runnable {

	private ObjectInputStream ois;

	private boolean flag = false;

	private MainFrame chatFrame;
	
	private MyFileChooser fc = new MyFileChooser();
	
	private static FileTransfer ft;
	
	private static ReceiveFile rf;
	
	private static String filename;
	
	private SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
	
	private String sary;
	
	/**
	 * 
	 * @param ois  对象输入流
	 * @param chatFrame 主面板
	 * 
	 */
	public RecieveThread(ObjectInputStream ois, MainFrame chatFrame) {
		this.ois = ois;
		this.chatFrame = chatFrame;
	}

	public void run() {
		while (!flag) {
			try {
				// 收包
				DataPacket datapacket = (DataPacket) ois.readObject();
				
				
				//System.out.println("收包"+datapacket.getType());
				
				
				
				if (datapacket.getType().equals(DataPacket.server_close_type)) {
					// 如果是关闭包的话,弹出提示,关闭客户端程序
					String serverClose = (String) datapacket.getData().get(
					"data");
					JOptionPane.showMessageDialog(chatFrame, serverClose,
							"提示框", JOptionPane.WARNING_MESSAGE);
					System.exit(0);
				}else if (datapacket.getType().equals(DataPacket.up_line_type)
						|| datapacket.getType().equals(
								DataPacket.down_line_type)) {
					
					// 上下线包
					String userId = datapacket.getFrom();// 取得userId
					DefaultMutableTreeNode tempuser = (DefaultMutableTreeNode) Public.userTable
					.get(userId);
					DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tempuser
					.getParent();
					parent.remove(tempuser);
					if (datapacket.getType().equals(DataPacket.up_line_type)) {
						// 上线包的话
						((User) tempuser.getUserObject()).setOnline(1);// 该用户上线了
						
						parent.insert(tempuser, 0);
					} else if (datapacket.getType().equals(DataPacket.down_line_type)) {
						// 下线包的话
						((User) tempuser.getUserObject()).setOnline(0);// 该用户下线了
						parent.insert(tempuser, parent.getChildCount());
					}
					chatFrame.getTree().updateUI();
					
				}else if (datapacket.getType().equals(
						DataPacket.privateChat_type)
						|| datapacket.getType()
						.equals(DataPacket.deptChat_type)||datapacket.getType()
						.equals(DataPacket.publicChat_type)) {
					chatFrame.getTextContent().setEditable(true);//设置能编辑的
					// 私聊包
					String fromId = datapacket.getFrom();// 取得userId
					DefaultMutableTreeNode tempNode = (DefaultMutableTreeNode) Public.userTable
					.get(fromId);
					String fromName = ((User) tempNode.getUserObject())
					.getName();
					
					HashMap data = datapacket.getData();
					ArrayList al = (ArrayList) data.get("data");
					MutableAttributeSet attrSet = (MutableAttributeSet) data
					.get("font");
					
					// 获取与编辑器关联的模型。StyledDocument用作通用样式化文档的接口。
					StyledDocument sdShow = chatFrame.getTextContent()
					.getStyledDocument();
					///SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
					StyleConstants.setForeground(sas, Color.gray);// 设置字体前景色
					

					// 返回文档中当前内容的字符数。
					int lenShow = sdShow.getLength();
					
					try {
						// 在显示区填加内容
						sdShow.insertString(lenShow, fromName + "  " + QQUtils.getCurDate()+":"
								+ "\n", sas);
						for (int i = 0; i < al.size(); i++) {
							// 返回文档中当前内容的字符数。
							lenShow = sdShow.getLength();
							// 设置 TextComponent 的文本插入符的位置。
							chatFrame.getTextContent().setCaretPosition(lenShow);
							Object o = al.get(i);
							if (o instanceof Icon) {
								chatFrame.getTextContent().insertIcon((ImageIcon) o);// 将图片显示在面板上
							} else if (o instanceof String) {
								sdShow.insertString(lenShow, (String) o,
										attrSet);
							}
						}
						lenShow = sdShow.getLength();
						sdShow.insertString(lenShow, "\n", null);
						chatFrame.getTextContent().setEditable(false);//设置不能编辑的
						
						chatFrame.getTextContent().setCaretPosition(lenShow);//光标定位到最后
						
					} catch (BadLocationException e1) {
						e1.printStackTrace();
					}
					
				}else if(datapacket.getType().equals(DataPacket.delete_user_type)){
					
					//				删除用户包
					String userId = datapacket.getFrom();// 取得userId
					DefaultMutableTreeNode tempuser = (DefaultMutableTreeNode) Public.userTable
					.get(userId);
					DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tempuser
					.getParent();
					parent.remove(tempuser);
					chatFrame.getTree().updateUI();
					
				}else if(datapacket.getType().equals(DataPacket.transfile_type)){
					
					String st = (String) datapacket.getData().get("filename");
					
					sary = st.substring(st.lastIndexOf("\\")+1);
					
					if ((JOptionPane.showConfirmDialog(chatFrame, datapacket.getFrom()+" 要给你发送文件 "+sary+" 是否接受?", "友情提示", JOptionPane.YES_NO_OPTION)) != 0){
						
						//不接受文件
						ObjectOutputStream oos = (ObjectOutputStream) ((ArrayList) Public.mySocketInfo
								.get(datapacket.getTo())).get(2);
						DataPacket infoPacket = null;
						HashMap data = new HashMap();
						data.put("filename",datapacket.getData().get("filename"));
						infoPacket = new DataPacket(DataPacket.cannotSendtransfile_type,
								datapacket.getTo(), datapacket.getFrom(), data);
						try {
							oos.writeObject(infoPacket);
							oos.flush();
						} catch (IOException e1) {
							e1.printStackTrace();
						}
						
						return;
					}
					
					
					
					Component comp = getLabelForInChooser(fc,   "FileChooser.fileNameLabelText");   
					if   (comp   instanceof   JTextField)   {   
						JTextField   field   =   ((JTextField)comp);   
							
						field.setText(sary);//默认设置发过来的文件名
						
					}   
					
					
					if (fc.showDialog(chatFrame, "保存文件") == JFileChooser.APPROVE_OPTION) {
						
						
						filename = fc.getSelectedFile().getAbsolutePath();
						
						rf = new ReceiveFile(filename,chatFrame.getTextContent());
						
						rf.start();
						
						
						chatFrame.getJtp().setSelectedIndex(1);
						
						// 确认可以发文件包
						
						ObjectOutputStream oos = (ObjectOutputStream) ((ArrayList) Public.mySocketInfo
								.get(datapacket.getTo())).get(2);
						DataPacket infoPacket = null;
						HashMap data = new HashMap();
						data.put("filename",datapacket.getData().get("filename"));
						infoPacket = new DataPacket(DataPacket.canSendtransfile_type,
								datapacket.getTo(), datapacket.getFrom(), data);
						
						try {
							oos.writeObject(infoPacket);
							oos.flush();
						} catch (IOException e1) {
							e1.printStackTrace();
						}
						
					}else{
						//不接受文件
						ObjectOutputStream oos = (ObjectOutputStream) ((ArrayList) Public.mySocketInfo
								.get(datapacket.getTo())).get(2);
						DataPacket infoPacket = null;
						HashMap data = new HashMap();
						data.put("filename",datapacket.getData().get("filename"));
						infoPacket = new DataPacket(DataPacket.cannotSendtransfile_type,
								datapacket.getTo(), datapacket.getFrom(), data);
						try {
							oos.writeObject(infoPacket);
							oos.flush();
						} catch (IOException e1) {
							e1.printStackTrace();
						}
					}
					
					
					
				}else if(datapacket.getType().equals(DataPacket.canSendtransfile_type)){
					
					
					chatFrame.getJtp().setSelectedIndex(1);
					
//					 获取与编辑器关联的模型。StyledDocument用作通用样式化文档的接口。
					StyledDocument sdShow = chatFrame.getTextContent()
					.getStyledDocument();
					//SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
					StyleConstants.setForeground(sas, Color.blue);// 设置字体前景色

					// 返回文档中当前内容的字符数。
					int lenShow = sdShow.getLength();
	
					sdShow.insertString(lenShow, QQUtils.getCurDate() + "\n"+  "对方同意了接收文件"+sary+ "\n", sas);
					
					
					//chatFrame.getTextContent().getStyledDocument().insertString(0, "对方同意了接收文件"+datapacket.getData().get("filename"),null);
					
					ft = new FileTransfer(9988,QQUtils.properties.getProperty("Address"),chatFrame.getTextContent(),datapacket.getData().get("filename").toString());
					ft.start();
					
				}else if(datapacket.getType().equals(DataPacket.cannotSendtransfile_type)){
					
					if (rf != null){
						rf = null;
					}
					
					if (ft != null){
						ft = null;
					}
					
					
					 //获取与编辑器关联的模型。StyledDocument用作通用样式化文档的接口。
						StyledDocument sdShow = chatFrame.getTextContent()
						.getStyledDocument();
						//SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
						StyleConstants.setForeground(sas, Color.blue);// 设置字体前景色

						// 返回文档中当前内容的字符数。
						int lenShow = sdShow.getLength();

		
						sdShow.insertString(lenShow, QQUtils.getCurDate() + "\n"+ "对方拒绝了接收文件"+ "\n", sas);
					//chatFrame.getTextContent().setText("对方拒绝了接收文件");
				}else if (datapacket.getType().equals(DataPacket.chat_all_type)){
					chatFrame.getJtp().setSelectedIndex(0);
					chatFrame.getNewsText().setText((String) datapacket.getData().get("data"));
				}
				
			} catch (IOException e) {
				e.printStackTrace();
				break;
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				break;
			} catch (BadLocationException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
				break;
			}
		}
	}
	/**
	 * 
	 * @param chooser JFileChooser
	 * @param key
	 * @return
	 */
	public   static   Component   getLabelForInChooser(JFileChooser   chooser,   String   key){   
		java.util.Locale   l   =   chooser.getLocale();   
		String   s   =   UIManager.getString(key,   l);   
		
		javax.swing.plaf.FileChooserUI   ui   =   chooser.getUI();   
		int   count   =   ui.getAccessibleChildrenCount(chooser);   
		for   (int   i=0;   i<count;   i++)   {   
			javax.accessibility.Accessible   a   =     
				ui.getAccessibleChild(chooser,   i);   
			JLabel   label   =   findLabel((JComponent)a,   s);   
			if   (label   !=   null)   {   
				return   label.getLabelFor();   
			}   
		}   
		return   null;   
	}   
	
	/**
	 * 
	 * @param comp
	 * @param s
	 * @return
	 */
	private   static   JLabel   findLabel(JComponent   comp,   String   s){   
		JLabel   label   =   null;   
		if   (comp   instanceof   JLabel)   {   
			if   (((JLabel)comp).getText().equals(s)){   
				label   =   (JLabel)comp;   
			}                           
		}   else   if   (comp   instanceof   JComponent)   {   
			Component[]   comps   =   comp.getComponents();                           
			for   (int   i=0;   i<comps.length;   i++)   {   
				if   (comps[i]   instanceof   JComponent)   {   
					label   =   findLabel((JComponent)comps[i],   s);   
					if   (label   !=   null)   {   
						break;   
					}   
				}   
			}                           
		}   
		return   label;   
	}

	public static FileTransfer getFt() {
		return ft;
	}
	
	public static ReceiveFile getRf() {
		return rf;
	}   


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -