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

📄 readthread.java

📁 聊天工具
💻 JAVA
字号:
package client.thread;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

import utils.InfoPacket;
import utils.StaticUtils;
import client.chat.chatpane.ChatFrame;
import client.chat.node.UserNode;
/**
 * 客户端的收发包线程.
 * @author 洪景泉
 *
 */
 
public class ReadThread extends Thread {

	private ChatFrame chatFrame = null;

	private InputStream is = null;
	private OutputStream os=null;
	private String userID=null;
	private String to=null;
	private String sArr[]=null;
	private JButton btn1=null;
	private JButton btn2=null;

	/**
	 *登录窗口调用该构造函数 
	 * @param chatFrame 主窗体对象
	 * @param userID 当前用户ID
	 * @param is 输入流
	 * @param os 输出流
	 */
	public ReadThread(ChatFrame chatFrame,String userID, InputStream is,OutputStream os) {
		this.chatFrame = chatFrame;
		this.is = is;
		this.os=os;
		this.userID=userID;		
	}

	public void run() {
		while (true) {

			// 睡眠
			try {
				sleep(20);
			} catch (Exception ex) {
				ex.printStackTrace();
			}

			// 接受信息
			InfoPacket dataPacket = null;
			try {
				byte[] bs = new byte[1024];
				is.read(bs);
				dataPacket = new InfoPacket(bs);
			} catch (SocketException e) {
				JOptionPane.showMessageDialog(chatFrame, "与服务器连接断开","提示",JOptionPane.ERROR_MESSAGE);
				System.exit(0);
				e.printStackTrace();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
			// 上线包
			if (dataPacket.getType()==InfoPacket.UP) {
				//System.out.println("收到上线包");
				//HashMap IDMap = dataPacket.getDatas();
				String IDMap=dataPacket.getDatas();
				upDown(IDMap, "up");
			}
			//下线包
			else if (dataPacket.getType()==InfoPacket.DOWN) {
				//System.out.println("收到下线包");
				//HashMap IDMap = dataPacket.getDatas();
				String IDMap=dataPacket.getDatas();
				upDown(IDMap, "down");
				if(IDMap.equals(userID)){
					JOptionPane.showMessageDialog(chatFrame, "你已被强制下线,窗口将关闭","提示",JOptionPane.INFORMATION_MESSAGE);
					System.exit(0);
				}
				System.out.println("收到下线包");
				
				
			}
//			 公告包
			 if (dataPacket.getType()==InfoPacket.AFFICHE) {
				String affiche =dataPacket.getDatas();
				chatFrame.getRPane().getTextArea().setText(affiche);
			}
			//聊天包
			 if (dataPacket.getType()==InfoPacket.CHAT) {
				
				String from = dataPacket.getFrom();
				String []arr=from.split(":");
				
				String to = dataPacket.getTo();
//				int tag = from.indexOf(":");
				
				
				String chatInfo=dataPacket.getDatas();
				
				JTextPane tpShow = chatFrame.getLPane().getShowText();
				StyledDocument showDoc = tpShow.getStyledDocument();
				
				tpShow.setEditable(true);
				//System.out.println((String)chatInfo.get("Info"));
				try {
					SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
					showDoc.insertString(showDoc.getLength(),arr[1]+"  "+sdf.format(new Date())+"\n",null);
					
					showDoc.insertString(showDoc.getLength(),chatInfo, null);
					showDoc.insertString(showDoc.getLength(), "\n", null);
					
//					 把当前用户收到的聊天记录放在聊天记录对话框里面
					
					chatFrame.getLPane().getCd().getChatHistory().append(" "+arr[1]+" "+sdf.format(new Date())+"\n");
					chatFrame.getLPane().getCd().getChatHistory().append(" "+chatInfo+"\n");
					
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
			 //收到发送文件请求包
			if(dataPacket.getType()==InfoPacket.FILE){
//				System.out.println("from  to ");
//				System.out.println(dataPacket.getFrom());
//				System.out.println(dataPacket.getTo());
				String[] from= dataPacket.getFrom().split(":");
				to=from[0];
				JTextPane tpShow = chatFrame.getLPane().getShowText();
				StyledDocument showDoc = tpShow.getStyledDocument();
				btn1=new JButton("保存");
				btn1.setEnabled(true);
				btn2=new JButton("拒绝");
				btn2.setEnabled(true);
				sArr=dataPacket.getDatas().split(",");
				
				try {
					SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
					String currentuser=(String)StaticUtils.currentUser.get("userName");
					showDoc.insertString(showDoc.getLength(),currentuser+" "+sdf.format(new Date())+"\n",null);
				
					showDoc.insertString(showDoc.getLength(),"接收文件:"+sArr[0],null);
					tpShow.setCaretPosition(showDoc.getLength());
					tpShow.insertComponent(btn1);
					
					showDoc.insertString(showDoc.getLength(),"还是",null);
					tpShow.setCaretPosition(showDoc.getLength());
					tpShow.insertComponent(btn2);
					showDoc.insertString(showDoc.getLength(),"\n",null);
				} catch (BadLocationException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
				btn1.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e) {
						//System.out.println("接收");
						//随机生成端口号
						int ran=0;
						while(true){
							ran=(int)( Math.random()*10000);
							if(ran>3000)break;
						}
						
						try {
							String port=String.valueOf(ran);
							String hostIP=java.net.InetAddress.getLocalHost().getHostAddress();
						
//						System.out.println("to"+to);
						
							InfoPacket infoPacket = new InfoPacket(InfoPacket.FILE_RESP,"true","3:"+to,hostIP+","+port);
						
							os.write(infoPacket.toByteArray());
						} catch (UnknownHostException e1) {
							e1.printStackTrace();
						} catch (Exception ex) {
							ex.printStackTrace();
						}
						
						AcceptFileThread at = new AcceptFileThread(chatFrame,ReadThread.this.sArr[1],ReadThread.this,ran);
						at.start();
						
						
					}
				});
				btn2.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e) {
						//System.out.println("拒绝");
						InfoPacket infoPacket = new InfoPacket(InfoPacket.FILE_RESP,"false","3:"+to,"");
						try {
							os.write(infoPacket.toByteArray());
						} catch (Exception ex) {
							ex.printStackTrace();
						}
						btn1.setEnabled(false);
						btn2.setEnabled(false);
						JTextPane tpShow = chatFrame.getLPane().getShowText();
						StyledDocument showDoc = tpShow.getStyledDocument();
						SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
						String currentuser=(String)StaticUtils.currentUser.get("userName");
						try {
							showDoc.insertString(showDoc.getLength(),currentuser+" "+sdf.format(new Date())+"\n",null);
							showDoc.insertString(showDoc.getLength(),"已经拒绝了对方的请求\n",null);
						} catch (BadLocationException e1) {
							// TODO 自动生成 catch 块
							e1.printStackTrace();
						}
					}
				});
				
				
			}
			//收到接受文件请求包
			if(dataPacket.getType()==InfoPacket.FILE_RESP){
//				对方接受了请求
				if(dataPacket.getFrom().equals("true")){
					String []sArr=dataPacket.getDatas().split(",");
					sendFileThread sFThread=new sendFileThread(chatFrame,sArr[0],sArr[1]);
					sFThread.start();
				}else{//对方拒绝了请求
					JTextPane tpShow = chatFrame.getLPane().getShowText();
					StyledDocument showDoc = tpShow.getStyledDocument();
					SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
					String currentuser=(String)StaticUtils.currentUser.get("userName");
					try {
						showDoc.insertString(showDoc.getLength(),currentuser+" "+sdf.format(new Date())+"\n",null);
						showDoc.insertString(showDoc.getLength(),"对方拒绝你的请求\n",null);
					} catch (BadLocationException e) {
						// TODO 自动生成 catch 块
						e.printStackTrace();
					}
				}
				
			}
			

		}
	}


	// 处理上下线
	private void upDown(String sid, String tag) {
		Object object = StaticUtils.usersNodeMap.get(sid);
		DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) object;

		Object dataObj = dmtn.getUserObject();
		UserNode userData = (UserNode) dataObj;

		DefaultTreeModel dtModel = (DefaultTreeModel) chatFrame.getRPane().getUserTree().getModel();

		DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) dmtn
				.getParent();

		dtModel.removeNodeFromParent(dmtn);
		if (tag.equals("up")) {
			userData.setUserOnline("1");
			dtModel.insertNodeInto(dmtn, parentNode, 0);
		} else if (tag.equals("down")) {
			userData.setUserOnline("0");
			//System.out.println("下线");
		dtModel	.insertNodeInto(dmtn, parentNode, parentNode.getChildCount());
		}
	}
	public JButton getBtn1() {
		return btn1;
	}
	public JButton getBtn2() {
		return btn2;
	}
}

⌨️ 快捷键说明

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