📄 serverthread.java
字号:
package com.jim.server;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import com.jim.database.Friendship;
import com.jim.database.JIMUser;
import com.jim.database.JIMUserDAO;
import com.jim.net.Connection;
import com.jim.net.JIMProtocol;
import com.jim.net.Message;
import com.jim.net.RequestObject;
public class ServerThread extends Thread {
/**
* 该线程使用的连接
*/
private Connection con;
/**
* 由主线程传入的和所有客户端的连接的HashMap。
*/
private HashMap<Integer,Connection> connections;
/**
* 当前处理的命令
*/
private int command;
/**
* 当前读取的请求对象
*/
private RequestObject req;
/**
* 负责日志处理
*/
private Logger log = Logger.getLogger(this.getClass());
/**
* 用于控制线程结束的一个标志变量。
*/
private volatile Thread blinker;
private boolean disConnected;
private boolean clientListening = false;
private JIMUserDAO dao;
/**
* 构造函数
*/
public ServerThread(Connection con,HashMap<Integer,Connection> connections){
this.con = con;
this.connections = connections;
dao = new JIMUserDAO();
}
public void run(){
//用于控制这个线程的结束
Thread thisThread = Thread.currentThread();
blinker = thisThread;
//循环处理客户端的请求。
while(blinker == thisThread){
//读取客户端发送的请求。
if(con.isAvialable()){
req = con.getRequest();
command = req.getCommand();
}else{
continue;
}
//根据命令的不同类型,执行不同的操作
dao.getSession().beginTransaction();
switch(command){
case JIMProtocol.REGIESTER:
register();
break;
case JIMProtocol.LONIN:
login();
break;
case JIMProtocol.GETFRIENDS:
getFriends();
break;
case JIMProtocol.FINDUSERS:
findUsers();
break;
case JIMProtocol.ADDFRIEND:
addFriend();
break;
case JIMProtocol.DELFRIEND:
deleteFriend();
break;
case JIMProtocol.UPDATEFRIENDS:
updateFriends();
break;
case JIMProtocol.UPDATEINFO:
updateInfo();
break;
case JIMProtocol.MSG2FRIEND:
msg2Friend();
break;
case JIMProtocol.LOGOUT:
logout();
break;
case JIMProtocol.DISCONNECT:
disconnect();
break;
default :
log.debug("unrecognised command");
break;
}
dao.getSession().getTransaction().commit();
}
//当线程要结束时,就从所维护的线程列表中移除当前线程。
JIMServer.serverThreads.remove(Thread.currentThread().getName());
}
private void disconnect() {
if (!disConnected) {
disConnected = true;
log.debug("get command disconnect");
//con.sendCommand(JIMProtocol.OVER);
con.close();
JIMServer.serverThreads.remove(this.getName());
this.finish();
}
}
public void finish(){
Thread moribund = blinker;
blinker = null;
moribund.interrupt();
}
private void msg2Friend() {
log.debug("got command msg2Friend");
Message msg =(Message) req.getParameter("message");
int to = msg.getTo();
log.debug("send message from " + msg.getFrom()+" to "+to);
Connection con = connections.get(new Integer(to));
if(con == null){
log.debug("the user "+to+" not logged in");
return ;
}
try {
while(con.isBusy()){
log.debug("wait for connection to send message");
Thread.currentThread().sleep(500);
}
con.setBusy(true);
con.sendCommand(JIMProtocol.GETMSG);
con.send(msg);
log.debug("message send out");
con.setBusy(false);
msg = null;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void logout() {
log.info("got command logout");
//con.sendCommand(JIMProtocol.OK);
int id = (Integer) req.getParameter("id");
if (id == con.getEndPoint()) {
dao.findById(id).setStatus(false);
connections.remove(new Integer(con.getEndPoint()));
//con.sendCommand(JIMProtocol.OVER);
if(!disConnected){
disConnected = true;
con.close();
}
JIMServer.serverThreads.remove(this.getName());
this.finish();
}
log.debug(con.getEndPoint() + " logout");
}
private void updateInfo() {
log.debug("got command updateInfo");
JIMUser u = (JIMUser)req.getParameter("user");
dao.merge(u);
con.setBusy(true);
con.sendCommand(JIMProtocol.OK);
con.send("服务器接收了更新信息!");
con.setBusy(false);
log.debug("command updateInfo finish");
}
private void updateFriends() {
log.debug("got command updateFriends");
Integer id = (Integer)req.getParameter("id");
log.debug("id in updateFriends:"+id);
RequestObject response = new RequestObject();
dao.getSession().clear();
JIMUser u = dao.findById(id);
u.setFriends(dao.findFriendsById(u.getJimno()));
response.addParameter("user", u);
response.addParameter("status", "OK");
con.setBusy(true);
con.sendCommand(JIMProtocol.OK);
con.sendRequest(response);
con.setBusy(false);
log.debug("command updateFriends finished");
}
private void deleteFriend() {
log.debug("got command deleteFreind");
JIMUser u = dao.findById((Integer)req.getParameter("id"));
Integer uid = (Integer)req.getParameter("uid");
u.deleteFriend(uid);
dao.update(u);
log.debug("deleteFreind finished");
}
private void addFriend() {
log.debug("got command addFriend");
JIMUser u = dao.findById((Integer)req.getParameter("id"));
Integer uid = (Integer)req.getParameter("uid");
u.addFriend(dao.findById(uid));
dao.update(u);
log.debug("command addFriend finished");
}
private void findUsers() {
log.debug("got command findUsers");
List<JIMUser> users = dao.findByCriteria();
RequestObject response = new RequestObject();
HashMap<Integer,JIMUser> ret = new HashMap<Integer,JIMUser>(0);
for(JIMUser u: users){
ret.put(u.getJimno(), u);
}
response.addParameter("users", ret);
con.setBusy(true);
con.sendCommand(JIMProtocol.OK);
con.sendRequest(response);
con.setBusy(false);
}
private void getFriends() {
log.debug("got command getFriends");
}
private void register() {
log.debug("got command register");
JIMUser u = (JIMUser)req.getParameter("user");
dao.save(u);
con.setBusy(true);
con.sendCommand(JIMProtocol.OK);
con.send(u.getJimno());
con.setBusy(false);
log.debug("successfully registed a new user "+u.getJimno());
}
private void login() {
log.info("got command login");
RequestObject response = new RequestObject();
Integer id =(Integer) req.getParameter("id");
String pwd =(String)req.getParameter("pwd");
JIMUser u = null;
u = dao.findById(id);
if(u != null){
if(u.getPwd().equals(pwd)){
log.debug("user logged in: "+u.getJimno());
u.setStatus(true);
u.setIp(con.getAddress().toString());
u.setFriends(dao.findFriendsById(u.getJimno()));
response.addParameter("status", "OK");
response.addParameter("user", u);
con.setEndPoint(u.getJimno().intValue());
connections.put(u.getJimno(), con);
clientListening = true;
}else{
response.addParameter("status", "密码错误");
}
}else{
response.addParameter("status", "登录号码不存在");
}
con.sendRequest(response);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -