📄 server_app.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 + -