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

📄 serverthread.java

📁 一个使用Java实现的类似与QQ的聊天程序。使用了Hibernate组建。可用于学习Java网络编程和Hiberante数据库组件的学习
💻 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 + -