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

📄 chatthread.java

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

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import server.dao.UserDAO;
import server.factory.DaoFactory;
import server.login.ServerFrme;
import utils.InfoPacket;
import utils.StaticUtils;

/**
 * 聊天线程
 * @author 洪景泉
 *
 */
 
public class ChatThread extends Thread {
	private ServerFrme qqServerFrm;

	private Socket s;

	// private ObjectInputStream is;
	// private ObjectOutputStream os;

	public ChatThread(ServerFrme qqServerFrm, Socket s) {
		this.qqServerFrm = qqServerFrm;
		this.s = s;
	}

	@Override
	public void run() {
		InputStream is = null;
		OutputStream os = null;

		// 获取流
		try {
			is = s.getInputStream();
			os = s.getOutputStream();
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		// 读取登录包
		InfoPacket packet = null;

		try {
			byte[] bs = new byte[1024];
			int a = is.read(bs);// 阻塞

			// 解包
			packet =new InfoPacket(bs);
			
			// 判断是否是登录包
			if (packet.getType() == InfoPacket.LOGIN) {

				String inceptMap = packet.getDatas();
				String[] sArr = inceptMap.split(",");
				
				String id = sArr[0];
				String pwd = sArr[1];

				String colList = "*";
				Map<String, String> sqlMap = new HashMap<String, String>();
				sqlMap.put("ID", id);
				// 查找所登录的用户是否存在
				// OracleDAO userDao = new OracleDAO();
				UserDAO userDao = DaoFactory.getUserDao();
				Vector<Vector<String>> datas = userDao.select(colList, sqlMap);

				if (datas.size() == 0) {
					// 登录失败,返回失败原因:用户帐号不存在. 并退出线程。
					HashMap<String, String> flagMap = new HashMap<String, String>();
					InfoPacket loginRespPacket = new InfoPacket(InfoPacket.LOGIN_RESP, "false", "", "用户帐号不存在");
				//	System.out.println("登录失败,返回失败原因:用户帐号不存在.");
					os.write(loginRespPacket.toByteArray());
					return;
				} else {
					colList = "*";
					sqlMap.put("ID", id);
					sqlMap.put("PassWord", pwd);

					datas = userDao.select(colList, sqlMap);
					if (datas.size() == 0) {
						// 登录失败,返回失败原因:密码错误. 并退出线程。
					//	HashMap flagMap = new HashMap();
						InfoPacket loginRespPacket = new InfoPacket(
								InfoPacket.LOGIN_RESP, "false", "", "密码错误");
						// System.out.println("登录失败,返回失败原因:密码错误.");
						os.write(loginRespPacket.toByteArray());
						return;
					} else {
						//判断当前用户是否已经登录
						colList = "*";
						sqlMap.put("ID", id);
						sqlMap.put("nisonLine","1");
						Vector<Vector<String>> flag = userDao.select(colList, sqlMap);
						if(flag.size() > 0){
							InfoPacket loginRespPacket = new InfoPacket(
									InfoPacket.LOGIN_RESP, "false", "", "你已经登录,不能重复登录!");
							os.write(loginRespPacket.toByteArray());
							return;
						}
						
						ReadThread readThread = new ReadThread(qqServerFrm, is,os);
						readThread.setName(id);
						// 登录成功
					
						// 1更新数据库的在线标志,并刷新 JTable
						userDao.updateOnLine(id, "1");// 1表示在线
						qqServerFrm.getServerPane().getCenterPane().reLoadTable();
						// 2 通知其它在线用户,当前用户上线。
//						 返回此 Hashtable 中所包含的键的 Set 视图
						Set<String> set = StaticUtils.onlineUser.keySet();
						InfoPacket upPacket = new InfoPacket(InfoPacket.UP, "","", id);
						Iterator<String> iter = set.iterator();
						while (iter.hasNext()) {
							String key = iter.next();
							// System.out.println(key);
							ArrayList al = (ArrayList) StaticUtils.onlineUser
									.get(key);
							((OutputStream) al.get(1)).write(upPacket.toByteArray());

						}
						
						
						// 3把刚上线用户的相关信息(输入流,输出流,线程)保存至一个Map
						
						ArrayList<Object> al = new ArrayList<Object>();
						al.add(is);
						al.add(os);
						al.add(readThread);
						Vector vt = datas.get(0);
						// System.out.println("部门"+vt.get(7));
						al.add(vt.get(7));

						StaticUtils.onlineUser.put(id, al);

						// 4将所有用户列表返回

						colList = "ID,Name,NickName,PassWord,Age,Telephone,Department,Address,nisonLine,Icon";
						sqlMap = new HashMap<String, String>();
						sqlMap.put("1", "1");
						datas = userDao.select(colList, sqlMap);
						// 正确
						// System.out.println("datas"+datas.size());
						String onlineMap="";
						for(int i=0;i<datas.size();i++){
							Vector<String> v=datas.get(i);
							for(int j=0;j<v.size();j++){
								onlineMap+=v.get(j);
								if(j<v.size()-1){
									onlineMap+=",";
								}
							}
							
							if(i<datas.size()-1){
								onlineMap+="!";
							}
						}
						
					
						InfoPacket loginRespPacket = new InfoPacket(InfoPacket.LOGIN_RESP, "true", "", onlineMap);
						os.write(loginRespPacket.toByteArray());

//						发送公告包
						InfoPacket affichePacket = new InfoPacket(InfoPacket.AFFICHE, "","", StaticUtils.afficheInfo);
						//ArrayList arrayList = (ArrayList) HashtableUtils.onlineUser.get(id);
						((OutputStream) al.get(1)).write(affichePacket.toByteArray());
						readThread.start();
						
						// 5更新日志
						

						return;
					}
				}

			}

		} catch (SocketException e) {
			e.printStackTrace();
			return;
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

}

⌨️ 快捷键说明

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