📄 chatthread.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 + -