//package server;
import java.io.*;
import java.net.*;
import java.util.*;
//import util.Message;
//import util.ChatConst;
//import util.UserRecorder;
/**
* 主工作类
*/
public class Work extends Thread
{
/**
* 当前用户信息
*/
private UserInfo userInfo = null;
/**
* 服务端网络对象输入流
*/
private ObjectInputStream In;
/**
* 网络输出流
*/
private ObjectOutputStream Out;
/**
* 与客户端相连的Socket
*/
private Socket socket;
/**
* 运行标志
*/
private boolean runFlag = true;
/**
* 服务器主体类对象引用
*/
private ChatServer server;
/*
* 定义检查当前用户是否在线的定时器
*/
private Timer checkOnLineTimer;
/*
* 判别是否已经检查在线状态
*/
private boolean isCheckOnLine = false;
/**
* 通信类构造方法
*/
public Work(Socket socket, ChatServer server) throws Exception
{
this.socket = socket;
this.server = server;
// 从网络连接中获取对象输入/输出流
In = new ObjectInputStream(socket.getInputStream());
Out = new ObjectOutputStream(socket.getOutputStream());
userInfo = null;
}
/**
* 从客户端读取消息
*/
public void receive() throws Exception
{
Message Msg;
if((Msg = (Message)In.readObject())!=null)//读取接收的数据
{
chatProtocol(Msg);
}
}
/**
* 对接收到的消息解析
*/
public void chatProtocol(Message objMsg) throws Exception
{
String orderStr = objMsg.getOrder();//收到的消息信令 ;
System.out.println(orderStr);
if(objMsg !=null)
{
if(orderStr.equals(ChatConst.CHAT_LOGIN))//登录操作
{
login(objMsg);
}else if(orderStr.equals(ChatConst.CHAT_REGISTERUSER))//客户端注册新用户
{
registerNewUser(objMsg);
}else if(orderStr.equals(ChatConst.CHAT_ADDFRIEND))//客户端新增好友处理,主要处理是向好友端发送邀请消息
{
addFriend(objMsg);
}else if(orderStr.equals(ChatConst.ADDFRIEND_AGREE))//好友端同意加入你的好友列表
{
addFriendAgree(objMsg);
}else if(orderStr.equals(ChatConst.ADDFRIEND_REFUSE))//客户拒绝被加入好友列表
{
addFriendRefuse(objMsg);
}else if(orderStr.equals(ChatConst.CHAT_DELFRIEND))//从好友队列中删除好友
{
delFriend(objMsg);
}else if(orderStr.equals(ChatConst.CHAT_PRIVATECHAT))//好友聊天消息转发
{
sendFriendMsg(objMsg);
}else if(orderStr.equals(ChatConst.CHAT_OFFLINE))
{
runFlag = false;
if(userInfo!= null)//判断客户是否登录
{
sendOffLine();//向好友发送下线通知
checkOnLineTimer.cancel();
server.setUserOffLine(userInfo);
}
objMsg.setOrder(ChatConst.CHAT_EXIT);
send(objMsg);
}else if(orderStr .equals(ChatConst.CHAT_FINDBYID))//查找用户信息
{
findByID(objMsg);
}else if(orderStr.equals(ChatConst.CHAT_ONLINE))//测定用户在线
{
isCheckOnLine = false;
}
}
}
/*
*用于询问客户端是否在线的信令,服务器定时向各客户端发送该信令。
*在指定的时间内等待客户的应答,其应答信令为CHAT_ONLINE,
*如果没有收到则表示该客户端以下线。
*通常这种在线轮询是由一个Timer组件来实现在线轮询的功能。
*/
class CheckOnLine extends TimerTask
{
public void run()
{
try{
if(!isCheckOnLine)//判别是否发送在线检查命令
{
isCheckOnLine = true;
Message objMsg = new Message();
objMsg.setOrder(ChatConst.CHAT_ISONLINE);
objMsg.setSourceID(userInfo.getID());
objMsg.setDestID(userInfo.getID());
send(objMsg);
}else //判定当前客户端下线
{
sendOffLine();//通知好友当前用户已下线
checkOnLineTimer.cancel(); //终止当前定时器
runFlag = false;
server.displayMessage("帐号为"+userInfo.getID()+"的用户已下线!");
}
}catch(Exception e)
{
checkOnLineTimer.cancel();
server.displayMessage(e.toString());
}
}
}
/**
* 向客户端发送消息
*/
public synchronized void send(Message msg) throws Exception
{
String strMsg = "正在发送消息给" + msg.getDestID()+",信令为:" + msg.getOrder();
server.displayMessage(strMsg); //显示发送给客户的信息
Out.writeObject(msg);
Out.flush();
}
/**
* 向指定的好友发送聊天信息
*/
public void sendFriendMsg(Message msg) throws Exception
{
int friendID = msg.getDestID();
UserInfo user = server.findUserByID(friendID);
if(user.isOnLine())//当好友在线时,转发聊天消息
{
Work working = user.getWorking();
working.send(msg);
}else{
server.addBufferMsg(user,msg);//当好友不在线时则缓冲聊天消息
}
}
public void login(Message msg)
{
int userID = msg.getSourceID();//取用户帐号
String password = (String)msg.getMessage();//取用户口令
try
{
userInfo = server.findUserByID(userID);
if(userInfo != null)
{//判断登录用户是否存在
if(userInfo.isOnLine()==false)//判断用户是否在线
{
if(userID==userInfo.getID())
{
if(password.equalsIgnoreCase(userInfo.getPassword()))//判断登录用口令是否正确
{
userInfo.setWorking(this);
userInfo.setOnLine();//设置在线标志
msg.setOrder(ChatConst.CHAT_SUCCESS);//设置登录成功信令
msg.setSourceID(0);//设置通信地址
msg.setDestID(userID);
//userInfo = server.getFriend(userInfo);
msg.setMessage(userInfo);
send(msg);//发送登录结果给客户
Message Msg = new Message();
sendBufferMsg(userInfo.getSendBuffer());//发送缓冲消息
Msg.setOrder(ChatConst.CHAT_ONLINE);//将上线消息告知所有的好友
Msg.setSourceID(userID);
//sendGroupMsg(Msg);
checkOnLineTimer = new Timer();//启动对当前用户是否在线检测的定时器
checkOnLineTimer.schedule(new CheckOnLine(),ChatConst.CHECKONLINE_DELAY*1000,
ChatConst.CHECKONLINE_DELAY*1000);
send(Msg);
}else
{
msg.setOrder(ChatConst.CHAT_FAIL);
msg.setDestID(userID);
msg.setSourceID(0);
String fail = "对不起,您所输入的帐号或密码有误,请您再次确认!!!";
msg.setMessage(fail);
send(msg);//发送登录结果给客户
}
}
else
{
msg.setOrder(ChatConst.CHAT_FAIL);
msg.setDestID(userID);
msg.setSourceID(0);
String fail = "对不起,您所输入的帐号或密码有误,请您再次确认!!!";
msg.setMessage(fail);
send(msg);//发送登录结果给客户
}
}
else
{
msg.setOrder(ChatConst.CHAT_FAIL);
msg.setDestID(userID);
msg.setSourceID(0);
String fail = "此帐号已经登录!";
msg.setMessage(fail);
send(msg);//发送登录结果给客户
}
}
}catch(Exception e)
{
server.displayMessage(e.toString());
}
}
/**
* 注册新用户
*/
public void registerNewUser(Message msg) throws Exception
{
try{
UserRecorder user = (UserRecorder)msg.getMessage();
userInfo = server.addNewUser(user,this);
if(userInfo.getID()!=0)//将成功注册的消息发送回客户端
{
msg.setDestID(userInfo.getID());
msg.setOrder(ChatConst.CHAT_REGISTERUSER);
msg.setSourceID(0);
msg.setMessage(userInfo);
send(msg);
}
J-QQ聊天程序 希望有兴趣的人下载看看
需积分: 0 176 浏览量
2008-11-16
15:11:02
上传
评论
收藏 92KB RAR 举报
稻草_8715
- 粉丝: 4
- 资源: 17
最新资源
- yes I can.mp3
- 解忧云SMS短信服务平台系统 短信发送系统 全解密完美版.zip
- 天迹云通信短信分销系统源码.rar
- Screenshot_20240515_190514_net.csdn.csdnplus.jpg
- Win11右键设置小工具(最新版)
- FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写
- MNIST手写数字数据集(原始数据+解析后7000张图片)
- cudart64-100.dll cudart64-101.dll cudart64-110.dll cusolver64-10
- EYEQ4老版分析丹佛萨的农夫看看
- 111111111111111111111
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0