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

📄 server_app.java

📁 用JAVA写的qq,为qq的跨平台使用提供了可能,一直都很讨厌tencent不为linux提供方便,自己写了一个qq,希望有人继续完善,我现在没空做了
💻 JAVA
字号:
//Server_app.java
/**
@author Joedan
*/
import java.util.*;
import java.net.*;

public class Server_app implements Runnable
{
//private
	class 数据包处理类
	{
		public void performed(SocketAddress add, String msg){}
	}
	class 注册数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)//override数据包处理类,使其能处理注册数据包
		{
//		提取用户id, 用户名,用户密码
			int fstCommaPos = msg.indexOf(','),
			    lstCommaPos = msg.lastIndexOf(',');
			String id = msg.substring(0, fstCommaPos),//提取id
			       name = msg.substring(fstCommaPos + 1, lstCommaPos),//提取name
			       pswd = msg.substring(lstCommaPos + 1);//提取password
/*		检查用户id是否可用
		if 用户id不可用
		{
			返回值 = 用户id不可用
			发送“注册结果数据包”给用户
		}
		将用户id,用户名,用户密码写到用户数据库中
		返回值 = 注册成功
		发送“注册结果数据包”给用户
*/
			String rslt = MyConstants.注册结果_成功;
			if (db.是否存在(id))
				rslt = MyConstants.注册结果_用户id已经存在;
			else if (!db.添加用户(id, name, pswd))
				rslt = MyConstants.注册结果_其它错误;
			server.发送注册结果数据包(add, rslt);
		}
	}
	class 上线数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理上线数据包
		{
//		提取用户id,用户pswd
			int CommaPos = msg.indexOf(',');
			String id = msg.substring(0, CommaPos),//提取id
			       pswd = msg.substring(CommaPos + 1);//提取pswd
//		发送登录结果数据包
//		用户ip,用户port
//		将用户id,用户ip,用户port写到在线用户数据库中
			String rslt = MyConstants.登录结果_成功;//暂时不察密码
			String ip = ((InetSocketAddress)add).getHostName(),//提取ip
			       port = "" + ((InetSocketAddress)add).getPort();//提取port
			db.添加在线用户(id, ip, port);
			server.发送登录结果数据包(add, rslt);//如果允许登录,在发送结果之前,先将其添加到在线用户
//		查找用户的好友文件,组装“好友列表数据包”给用户
//		查找用户的好友中哪些在线,组装“在线好友列表数据包”给用户
			Enumeration list = db.好友列表(id);
			rslt = "";
			String rslt2 = "";//在线好友
			byte num = 0;//好友数目
			byte num2 = 0;//在线好友数目
			String tmp;
			while (list.hasMoreElements())
			{
				tmp = (String)list.nextElement();//获取下一个id
				rslt += "," + tmp + "," + db.获取用户名(tmp);//添加好友资料
				num++;//好友数目增加
				if (db.是否在线(tmp))
				{
					rslt2 += "," + tmp + "," + db.获取在线用户的地址(tmp);
					num2++;
				}
			}
			rslt = "" + num + rslt;
			rslt2 = "" + num2 + rslt2;
			server.发送好友列表数据包(add, rslt);
			server.发送在线好友列表数据包(add, rslt2);
//		组装“好友上线数据包”给添加用户为好友的用户
			String address;//对方address
			list = db.被加列表(id);//id被哪些人加为好友
			while (list.hasMoreElements())
			{
				tmp = (String)list.nextElement();//获取下一个id
				if (db.是否在线(tmp))//如果在线,发送数据包通知他该id上线
				{
					address = db.获取在线用户的地址(tmp);
					CommaPos = address.indexOf(',');
					server.发送好友上线数据包(new InetSocketAddress(address.substring(0, CommaPos),
					                                                Integer.parseInt(address.substring(CommaPos + 1))),
					                          id, ip, port);
				}
			}
		}
	}
	class 下线数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理下线数据包
		{
//		提取用户id
			String id = msg;
//		将用户资料从在线用户数据库中去除
			db.删除在线用户(id);
//		组装“好友下线数据包”给用户的在线好友
			Enumeration list = db.被加列表(id);//id被哪些人加为好友
			String tmp;
			String address;//对方address
			int CommaPos;
			while (list.hasMoreElements())
			{
				tmp = (String)list.nextElement();//获取下一个id
				if (db.是否在线(tmp))//如果在线,发送数据包通知他该id下线
				{
					address = db.获取在线用户的地址(tmp);
					CommaPos = address.indexOf(',');
					server.发送好友下线数据包(new InetSocketAddress(address.substring(0, CommaPos),
					                                                Integer.parseInt(address.substring(CommaPos + 1))),
					                          id);
				}
			}
		}
	}
	class 添加好友数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理添加好友数据包
		{
//		提取用户id,好友id
			int CommaPos = msg.indexOf(',');
			String id1 = msg.substring(0, CommaPos),
			       id2 = msg.substring(CommaPos + 1);
//		将好友id添加到用户好友文件中
//		如果该好友在线,组装“好友上线数据包”给用户
			String address;//对方address
			if (db.添加好友(id1, id2))
				if (db.是否在线(id2))
				{
					address = db.获取在线用户的地址(id2);
					CommaPos = address.indexOf(MyConstants.SPLIT);
					server.发送好友上线数据包(add, id2, address.substring(0, CommaPos), address.substring(CommaPos + 1));
				}
		}
	}
	class 删除好友数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理删除好友数据包
		{
//		提取用户id,好友id
			int CommaPos = msg.indexOf(',');
			String id1 = msg.substring(0, CommaPos),
			       id2 = msg.substring(CommaPos + 1);
//		将该好友从用户好友文件中删除
			db.删除好友(id1, id2);
		}
	}
	class 请求在线好友列表数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理请求在线好友列表数据包
		{
//		提取用户id
			String id = msg;
//		查找用户好友
//		判断哪些用户在线,组装“在线好友列表”发送给用户
			Enumeration list = db.好友列表(id);
			String rslt = "";//在线好友
			byte num = 0;//在线好友数目
			String tmp;
			while (list.hasMoreElements())
			{
				tmp = (String)list.nextElement();//获取下一个id
				if (db.是否在线(tmp))
				{
					rslt += "," + tmp + "," + db.获取在线用户的地址(tmp);
					num++;
				}
			}
			rslt = "" + num + rslt;
			server.发送在线好友列表数据包(add, rslt);
		}
	}
	class 请求好友列表数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理请求好友列表数据包
		{
//		提取用户id
			String id = msg;
//		组装“好友列表数据包”发送给用户
			Enumeration list = db.好友列表(id);
			String rslt = "";
			byte num = 0;//好友数目
			String tmp;
			while (list.hasMoreElements())
			{
				tmp = (String)list.nextElement();//获取下一个id
				rslt += "," + tmp + "," + db.获取用户名(tmp);//添加好友资料
				num++;//好友数目增加
			}
			rslt = "" + num + rslt;
			server.发送好友列表数据包(add, rslt);
		}
	}
	class 修改密码数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理修改密码数据包
		{
//		提取用户id,用户新密码
			int CommaPos = msg.indexOf(MyConstants.SPLIT);
			String id = msg.substring(0, CommaPos),//用户id
			       pswd = msg.substring(CommaPos + 1);//用户新密码
//		修改用户的密码
			String rslt = MyConstants.修改密码结果_失败;
			if (db.修改密码(id, pswd))
				rslt = MyConstants.修改密码结果_成功;
			server.发送修改密码结果数据包(add, rslt);
		}
	}
	class 查询在线用户数据包处理类 extends 数据包处理类
	{
		public void performed(SocketAddress add, String msg)// override数据包处理类,使其能处理查询在线用户数据包
		{
//		从在线用户数据库中顺序提取10个用户
			Enumeration list = db.在线用户列表();
//		组装“在线用户列表数据包”给用户
			int num = 0;//用户数量
			String address;//地址
			String id;
			String rslt = "";//结果
			while (list.hasMoreElements())
			{
				id = (String)list.nextElement();
//提示(db.获取用户名(id));
				rslt += "," + id + "," + db.获取用户名(id);//加入用户资料
				num++;//用户数量增加
			}
			rslt = "" + num + rslt;
			server.发送在线用户列表数据包(add, rslt);
		}
	}

	Hashtable 数据包处理 = new Hashtable();
	Server server = new Server(MyConstants.PORT);
	DatagramPacket p;
	Database db = new Database();

	Server_app()
	{
//		将所有数据包处理类对象一一入哈希表
		数据包处理.put(MyConstants.注册, new 注册数据包处理类());
		数据包处理.put(MyConstants.上线 , new 上线数据包处理类());
		数据包处理.put(MyConstants.下线 , new 下线数据包处理类());
		数据包处理.put(MyConstants.增加好友 , new 添加好友数据包处理类());
		数据包处理.put(MyConstants.删除好友 , new 删除好友数据包处理类());
		数据包处理.put(MyConstants.请求好友列表 , new 请求好友列表数据包处理类());
		数据包处理.put(MyConstants.请求在线好友列表 , new 请求在线好友列表数据包处理类());
		数据包处理.put(MyConstants.修改密码 , new 修改密码数据包处理类());
		数据包处理.put(MyConstants.查询在线用户 , new 查询在线用户数据包处理类());

		new Thread(this).start();
	}

	public static void main(String args[])
	{
/*		将所有数据包处理类对象一一入哈希表
		while(p = server.接收数据包)
			new subThread(p).start();
*/
		new Server_app();
	}
	class subThread extends Thread
	{
		SocketAddress add;
		String msg;
		subThread(SocketAddress _add, String _msg)
		{
			add = _add;
			msg = _msg;
		}
		public void run()
		{
//			判断p的类型
//			相应数据包处理类对象.performed();
提示(msg);
			((数据包处理类)数据包处理.get(msg.substring(0, MyConstants.LENGTH_OF_RULE))).performed(add,
			                                                                                       msg.substring(MyConstants.LENGTH_OF_RULE)
			                             );
//应该catch一下,数据包可能是错误的
		}
	}
	public void run()
	{
		DatagramPacket p;
		while(true)
		{
			p = server.读取数据包();
			new subThread(p.getSocketAddress(), new String(p.getData()).trim()).start();
		}
	}
	static void 提示(String s)
	{
		System.out.println(s);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -