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

📄 processmsg.java

📁 Java+Eclipse+Mysql的局域网聊天程序源代码
💻 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 + -