📄 processmsg.java
字号:
import java.util.Date;
class ProcessMsg implements Runnable
{
private Thread t=null;
private String []strarray=null;
private int typetag=0;
private QQServer qqs=null;
private DbManage dbm=null;
public ProcessMsg(String str,QQServer qqs)
{
strarray=str.split("\\|");
typetag=Integer.parseInt(strarray[2]);
dbm=new DbManage();
this.qqs=qqs;
}
public void start()
{
t=new Thread(this);
t.start();
}
public void run()
{
if(strarray[1].equals("0")) //无需回复
{
switch(typetag)
{
case 0: //用户收到服务端发起的数据包的回复
//deleteSendedMsg(strarray[0]);
break;
case 1: //用户退出 (时间标志|回复标志|类别标志|用户名)
userOffline(strarray[3]);
break;
default:
break;
}
}
else //需要回复
{
switch(typetag)
{
case 0: //登录消息(时间标志|回复标志|类别标志|用户名|用户密码|客户地址|客户端口)
checkUser(strarray); //校验用户名
break;
case 1: //客户读取好友列表请求(时间标志|回复标志|类别标志|用户|用户IP|用户端口)
returnFriends(strarray); //返回好友列表
sendOffLineMsg(strarray);
break;
case 3: //收到客户端发来的离线消息(时间标志|回复标志|类别标志|来源(用户名)|去向(用户名)|消息主体|来源地址|来源端口
storeOffLineMsg(strarray); //保存离线消息
break;
case 4: //用户请求群列表 (时间标志|回复标志|类型标志|用户名|来源地址|来源端口)
returnGroups(strarray);
break;
default:
break;
}
}
}
/////////////////////////发送群列表///////////////////
private void returnGroups(String []strarray)
{
String sql="select A.GroupNum,B.GroupName,count(select * from groupdetail from grouplist A,groupdetail B where UserName='"+ strarray[3]+"'";
String []grouplist=dbm.getArray(sql);
if(grouplist!=null)
{
for(int i=0;i<grouplist.length;i++)
{
}
}
}
/////////////////////////将离线消息保存//////////////////
private void storeOffLineMsg(String []strarray)
{
String sql="insert into offlinemsg(UserFrom,UserTo,Msg) values('"+strarray[3]+"','"+strarray[4]+"','"+strarray[5]+"')";
dbm.execute(sql);
}
private void sendOffLineMsg(String []strarray)
{
String username=strarray[3];
String userip=strarray[4];
int userport=Integer.parseInt(strarray[5]);
String sql="select A.UserFrom,A.UserTo,A.Msg,"+ //offlinemsg[0],offlinemsg[1],2
"B.CurrentState,B.CurrentIP,B.CurrentPort,A.MsgID"+ //offlinemsg[3,4,5]
" from offlinemsg A,user B"+
" where UserTo='"+username+"' and UserFrom=UserName";
String []offlinemsg=dbm.getArray(sql);
if(offlinemsg!=null) //发送离线消息
{
for(int i=0;i<offlinemsg.length;i++)
{
String []offlinemsgone=offlinemsg[i].split("\\,");
//时间标志|回复标志|类别标志|来源(用户名)|去向(用户名)|消息主体|来源地址|来源端口
String msg="1|3|"+offlinemsgone[0]+"|"+offlinemsgone[1]+"|"+offlinemsgone[2];
if(offlinemsgone[3].equals("在线"))
msg=msg+"|"+offlinemsgone[4]+"|"+offlinemsgone[5];
else
{
ReadConfig rc=new ReadConfig();
String server_addr=rc.getString("addr",false);
String server_port=rc.getString("port", false);
msg=msg+"|"+server_addr+"|"+server_port;
}
qqs.sm.setMsg(msg, userport, userip, false);
//从数据库删除已发送的离线消息
// String sql2="delete from offlinemsg where MsgID='"+offlinemsgone[6]+"'";
// dbm.execute(sql2);
}
}
}
/*public synchronized void deleteSendedMsg(String serialnum)
{
MsgVector sp_current=null;
sp_current=msgvector[1];
while(sp_current.next!=null)
{
if(sp_current.next.time==Integer.parseInt(serialnum))
{
sp_current.next=sp_current.next.next;
numofmsg[1]--; //删除一个已发送消息
break;
}
else
{
sp_current=sp_current.next;
}
}
}*/
//////////////////////////返回好友列表/////////////////////
private void returnFriends(String []strarray)
{
String sql="select A.UserName,A.RealName,A.Icon,A.CurrentIP,A.CurrentPort,A.CurrentState "+
" from user A,friend B where B.UserName='"+strarray[3]+"' and B.FriendID=A.UserName";
String []friendsarray=dbm.getArray(sql);
String msg="0|2|";
if(friendsarray!=null)
{
for(int i=0;i<friendsarray.length;i++)
{
if(i==0)
msg=msg+friendsarray[i];
else
{
msg=msg+";"+friendsarray[i];
}
}
qqs.sm.setMsg(msg, Integer.parseInt(strarray[5]), strarray[4], false);
}
}
//////////////////////////当收到用户下线时应执行的操作///////////
private void userOffline(String username)
{
//通知该用户的所有在线好友
tellFriends_OfflineInfo(username);
//从服务器列表中删除
removeFromServer(username);
//将数据库中状态设为'离线'
String sql="update user set CurrentState='离线' where UserName='"+username+"'";
dbm.updateInfo(sql);
}
private void checkUser(String[] str)
{
String sql="select * from User where UserName='"+str[3]+"'";
String sql2="select * from User where UserName='"+str[3]+"' and PassWord='"+str[4]+"'";
String []rs1=dbm.getArray(sql);
String []rs2=dbm.getArray(sql2);
String msg=null;
if(rs1==null)
{
msg=str[0]+"|0|1|0|unamewrong";
//回复登录验证信息(失败:用户名错误)
replyLogInfo(msg,str);
}
else if(rs1!=null&&rs2==null)
{
msg=str[0]+"|0|1|0|passwdwrong";
//回复登录验证信息(失败:密码错误)
replyLogInfo(msg,str);
}
else if(rs1!=null&&rs2!=null)
{
String []tmp=rs2[0].split("\\,"); //用户的所有信息
//设置用户上线(修改数据库中登录有关消息)
sql="update user set CurrentIP='"+str[5]+"',CurrentPort='"+str[6]+"',LogTime='"+Function.getCurrentTime()+"',CurrentState='在线' where UserName='"+tmp[0]+"'";
if(!dbm.updateInfo(sql))
msg=str[0]+"|0|1|0|serverwrong"; //如果服务器无法记录用户登录,则发送登录失败消息
msg=str[0]+"|0|1|1|success";
//回复登录验证信息
replyLogInfo(msg,str);
//将用户信息显示在服务端上
displayOnServer(tmp,str);
//向其所有在线好友发送上线消息
tellFriends_OnlineInfo(tmp,str);
}
}
////////////////////在服务端列表中增加一个上线用户////////////////
private void displayOnServer(String []tmp,String[] str)
{
ListCellInfo templci=new ListCellInfo(tmp[9],tmp[0],tmp[1],str[5],Function.getCurrentTime());
qqs.dlm_User.addElement(templci);
if(qqs.lcinum<=0)
{
qqs.lci.next=templci;
qqs.lciend=qqs.lci.next;
}
else
{
qqs.lciend.next=templci;
qqs.lciend=templci;
}
qqs.lcinum++;
}
////////////////////从服务器中删除一用户(用户下线)/////////////////
private void removeFromServer(String username)
{
ListCellInfo temp=qqs.lci.next;
while(temp!=null)
{
if(username.equals(temp.getUid()))
qqs.dlm_User.removeElement(temp);
temp=temp.next;
}
}
//////////向在线好友发送下线消息//////////////
private void tellFriends_OfflineInfo(String username)
{
String sql="select A.CurrentIP,A.CurrentPort from " +
"user A,friend B "+
"where B.FriendID=A.UserName and "+
"A.CurrentState='在线' and B.UserName='"+username+"'";
String []tmp2=dbm.getArray(sql); //返回所有好友的地址和端口
String msg="1|2|"+username;
if(tmp2!=null)
{
for(int i=0;i<tmp2.length;i++)
{
String []tmp22=tmp2[i].split("\\,");
//(消息格式:"时间标志(发送时添加)|回复标志|类型标志|好友ID")
qqs.sm.setMsg(msg, Integer.parseInt(tmp22[1]), tmp22[0], false);
}
}
}
/////////////////向在线好友发送好友上线消息//////////////
private void tellFriends_OnlineInfo(String[] tmp,String []str)
{
String sql="select A.CurrentIP,A.CurrentPort from " +
"user A,friend B "+
"where B.FriendID=A.UserName and "+
"A.CurrentState='在线' and B.UserName='"+tmp[0]+"'";
String []tmp2=dbm.getArray(sql); //返回所有好友的地址和端口
sql="select RealName,Icon,Introduce from user where username='"+tmp[0]+"'";
String []tmp3=dbm.getArray(sql); //获取本人基本信息
String []tmp33=tmp3[0].split("\\,");
if(tmp2!=null)
{
for(int i=0;i<tmp2.length;i++)
{
String []tmp22=tmp2[i].split("\\,");
//(消息格式:"时间标志(发送时添加)|回复标志|类型标志|好友ID|好友姓名|好友头像|好友介绍|好友IP|好友端口")
String msg="1|1|"+tmp[0]+"|"+tmp33[0]+"|"+tmp33[1]+"|"+tmp33[2]+"|"+str[5]+"|"+str[6];
qqs.sm.setMsg(msg, Integer.parseInt(tmp22[1]), tmp22[0], true);
}
}
}
///////////////////向登录用户回复登录信息验证消息/////////////
private void replyLogInfo(String msg,String[]str)
{
qqs.sm.setMsg(msg, Integer.parseInt(str[6]), str[5], true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -