📄 work.java
字号:
package server;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Iterator;
import setting.Embody;
import setting.User;
public class Work extends Thread{
/**
* 定义变量
*/
public int id;
/**
* 定义对象输入流
*/
private ObjectInputStream netIn=null;
/**
* 定义对象输出流
*/
private ObjectOutputStream netOut=null;
/**
* 定义Socket
*/
private Socket socket=null;
/**
* 接收网络信息标志
*/
private boolean runFlag=true;
/**
* 定义Server对象
*/
private Serve serve=new Serve();
/**
* 构造函数
*/
Work(Serve serve,Socket socket) throws IOException
{
this.serve = serve;
this.socket=socket;
netIn = new ObjectInputStream(socket.getInputStream());
netOut = new ObjectOutputStream(socket.getOutputStream());
}
/**
* 线程主体
*/
public void run() {
while (runFlag) {
receive(); //始终接受来自客户的信令,除非用户退出
}
}
/**
* 向网络发送消息
*/
public void send(Embody objMsg)
{
try{
netOut.writeObject(objMsg);
netOut.flush();
}catch(IOException e){
System.out.println("发送异常"+e.getMessage());
}
}
/**
* 接收信令,调用chatProtocol
*/
@SuppressWarnings("deprecation")
public void receive()
{
Embody objMsg = new Embody();
try
{
if ((objMsg = (Embody) netIn.readObject()) != null)
{
serve.serverUI.setShowTextArea(true);
serve.serverUI.setShowTextArea1(false);
serve.serverUI.layout.first(serve.serverUI.jPaneShowTextArea);
serve.serverUI.getJTextArea().append(
Serve.getTime() + "处理用户请求:" + objMsg.getOrder()
+ "\n");
serve.serverUI.getJTextArea().selectAll();
chatProtocol(objMsg);
}
} catch (IOException e)
{
System.out.println("IO异常");
stop();// 终止正在运行的线程
}
catch (ClassNotFoundException e)
{
System.out.println("找不到这个类");
}
}
/**
* 接受信令,调用Work接收信令的
* 注册新用户
* 聊天
* 用户登录
* 添加好友
* 发送企业消息
* 消息签收
* 删除好友
* 修改个人信息
* 检查是否有留言
* 检查用户是否在线方法
* 关闭连接发送离线消息
*/
public void chatProtocol(Embody objMsg)
{
registerNewUser(objMsg);
login(objMsg);
addFriend(objMsg);
modifyUserInfo(objMsg);
closeConn(objMsg);//
personchat(objMsg);//聊天
Inerchat(objMsg);//消息签收
Inerchatflish(objMsg);//验证
checkliuyan(objMsg);
delfriend(objMsg);
checkfriendstatus(objMsg);
checkFreindInfo(objMsg);
checkFreindIP(objMsg);
}
/**
* 接收用户登陆相关信令
*/
public void login(Embody objMsg){
String order=objMsg.getOrder();//得到信令
if(order.equals(setting.Command.login))
{
User user=new User();//保存从客户端传来的号码和密码
User userInfo=new User();//保存从数据库读出的USER对象
user=(User)objMsg.getObjMessage();//传来的只有号码和密码
System.out.println("用户登陆");
if(!new File(".\\UserDB.db").exists())
//若用户数据库不存在则返回给客户密码错误消息
{
objMsg.setOrder(setting.Command.loginfail);//设置反馈给客户登录失败的信令
send(objMsg);
return;
}
userInfo=serve.readUserDBbyID(user.getID());//根据号码读取
if(userInfo.getID()==user.getID()&&userInfo.getPassword().equals(user.getPassword()))
{//判断所传来的ID和密码是否相等
serve.saveWorkAndUser(userInfo);
//把此用户存在USERINFO中用与和其他客户交互时 查询相关线程
//主要是为了获取ID
if(serve.isOnline(userInfo))//判断此用户是否登录 在线则返回真
{
objMsg.setSourceID(userInfo.getID());
objMsg.setDestID(userInfo.getID());
objMsg.setOrder(setting.Command.loginreapt);
send(objMsg);
return;//若登录了则返回
}
userInfo.setIP(user.getIP());
userInfo.setOnline();//将用户设置为在线状态
serve.modifyUserInfo(userInfo);
//保存以后再看用户的状态是否修改
objMsg.setOrder(setting.Command.loginsuccess);//发给客服注册成功的信令
objMsg.setObjMessage(userInfo);//把此用户的信息反馈给客服端
send(objMsg);
serve.serverUI.getJTextArea().append(Serve.getTime()+"用户验证成功"+String.valueOf(userInfo.getID())+"连入服务器"+"\n");
}else
{
//密码不正确
objMsg.setOrder(setting.Command.loginfail);
send(objMsg);
}
}
}
/**
* 查询好友状态
*/
public void checkfriendstatus(Embody objMsg)
{
String order=objMsg.getOrder();
if(order.equals(setting.Command.checkfriendstatus))//读取好友的状态
{
User userInfo=new User();
User user=new User();
user=(User)objMsg.getObjMessage();
userInfo=serve.readUserDBbyID(user.getID());
User userfriendInfo=new User();
if(userInfo.getFriend().size()>0)
{
for(int i=0;i<userInfo.getFriend().size();i++)
{
userfriendInfo=(User)userInfo.getFriend().elementAt(0);
if(serve.isOnline(userfriendInfo))//好友在线 我需把他加如我的好友列表
{
objMsg.setSourceID(userInfo.getID());
objMsg.setDestID(userfriendInfo.getID());//传此好友的ID号给我 以便添加在哪
objMsg.setObjMessage(userfriendInfo);//传去好友对象
objMsg.setOrder(setting.Command.friendisonline);//好友在线的信令
send(objMsg);
}
if(!serve.isOnline(userfriendInfo))//不在
{
objMsg.setSourceID(userInfo.getID());
objMsg.setDestID(userfriendInfo.getID());
objMsg.setObjMessage(userfriendInfo);
objMsg.setOrder(setting.Command.friendisoffline);//好友不在线的信令
send(objMsg);
}
}
}
}
if(order.equals(setting.Command.updatemetofriend))
{
objMsg.setOrder(setting.Command.updatemetofriendaccept);
serve.sendpersonal(objMsg.getDestID(), objMsg);//目标ID是好友的
}
}
/**
* 接收用户注册信令
*/
@SuppressWarnings("unchecked")
public void registerNewUser(Embody objMsg)
{
String order=objMsg.getOrder();
if(order.equals(setting.Command.register))
{
User userInfo=new User();//这是和服务器的首次通信 需实例化userInfo
//用户的初始状态为1(1为不在线 0为在线)
userInfo=(User)objMsg.getObjMessage(); //把传来的User对象传给userInfo
if(!new File(".\\UserDB.db").exists())//若用户数据库文件不存在 即注册的第一个客户
{
userInfo.setID(1000);//注册号码的是第一个用户1000
serve.addNewUser(userInfo);
objMsg.setOrder(setting.Command.registersuccess);
objMsg.setObjMessage(userInfo);
send(objMsg);
}else{//若用户数据库文件存在
serve.readUserDB(); //把用户文件中的用户读入arraylist中
Iterator iter=serve.getArrayList().iterator();
int size=0;
while(iter.hasNext())
{
@SuppressWarnings("unused")
User user=(User)iter.next();
size++;//有多少个用户
}
userInfo.setID(size+1000);
serve.addNewUser(userInfo);//不用再实例化arraylist
objMsg.setOrder(setting.Command.registersuccess);
objMsg.setObjMessage(userInfo);
send(objMsg);
}
}//用户注册
}
/**
* 接收用户关闭网络连接信令
*/
public void closeConn(Embody objMsg)
{
String order=objMsg.getOrder();
if(order.equals("退出"))
{
//不再接收来自网络的消息 但还是要要向好友发送的
User exituser=new User();
exituser=serve.readUserDBbyID(objMsg.getSourceID());
exituser.setOffline();
serve.saveDB(exituser);
serve.serverUI.getJTextArea().append(Serve.getTime()+" 用户"
+String.valueOf(exituser.getID())+ "下线"+"\n");
User userfriendInfo=new User();
if(exituser.getFriend().size()>0)
{
for(int i=0;i<exituser.getFriend().size();i++)
{
userfriendInfo=(User)exituser.getFriend().elementAt(i);
if(serve.isOnline(userfriendInfo))//若用户在线 才发出我离线的通知
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -