📄 client_app.java
字号:
//Client_app.java
/**
@author Joedan
*/
import java.util.*;
import java.net.*;
import myevent.*;
import javax.swing.*;
class Client_app implements Runnable, 好友消息发送代理, 收尾动作监视器
{
程序界面 win = new 程序界面();
Thread thrdReceive;//负责接收线程
Client client = new Client("127.0.0.1", MyConstants.PORT);//客户端类对象,负责收到数据包
Hashtable 数据包处理 = new Hashtable();//存放了数据包类型及其对应的处理类,方便扩展
MyDialog dialog = new MyDialog();
class 数据包处理类//对数据包进行处理的类族的基类
{
public void performed(String msg){}//to be overriden
}
class 系统信息数据包处理类 extends 数据包处理类
{
public void performed(String msg)
{
}
}
class 好友上线数据包处理类 extends 数据包处理类
{
public void performed(String msg)
{
win.好友上线(msg);
}
}
class 好友下线数据包处理类 extends 数据包处理类
{
public void performed(String msg)
{
win.好友下线(msg);
}
}
class 好友消息数据包处理类 extends 数据包处理类
{
public void performed(String msg)
{
win.好友消息处理(msg);
}
}
class 在线好友列表数据包处理类 extends 数据包处理类
{
public void performed(String msg)
{
win.刷新在线好友列表(msg);
}
}
class 好友列表数据包处理类 extends 数据包处理类
{
public void performed(String msg)
{
win.刷新好友列表(msg);
}
}
Client_app()
{
数据包处理.put(MyConstants.系统信息, new 系统信息数据包处理类());
数据包处理.put(MyConstants.好友上线, new 好友上线数据包处理类());
数据包处理.put(MyConstants.好友下线, new 好友下线数据包处理类());
数据包处理.put(MyConstants.好友消息, new 好友消息数据包处理类());
数据包处理.put(MyConstants.好友列表, new 好友列表数据包处理类());
数据包处理.put(MyConstants.在线好友列表, new 在线好友列表数据包处理类());
//其它数据包不会在聊天过程中收到
/* 显示登录界面1,提供登录或注册
选择登录,出现登录界面2进行登录结果等待
如果登录成功,到下一操作
如果登录失败,提示用户,回到登录界面1
or
选择注册,出现“用户信息填写界面”进行注册
如果注册成功,提示用户,回到登录界面1
如果注册失败,提示用户,回到“用户信息填写界面”
*/
while(true)
{
String tmp = dialog.显示登录界面();//tmp = 登录界面的返回值
if (tmp.equals(MyDialog.登录_取消) || tmp.equals(MyDialog.登录_关闭))//用户退出登录
System.exit(0);
else if (tmp.equals(MyDialog.登录_注册))//用户选择注册
{
while(true)
{
tmp = dialog.显示注册界面();//tmp = 注册界面返回值
if (tmp.equals(MyDialog.注册_取消) || tmp.equals(MyDialog.注册_关闭))//用户退出注册
break;
int fstSplitPos = tmp.indexOf(MyConstants.SPLIT),
scndSplitPos = tmp.indexOf(MyConstants.SPLIT, fstSplitPos + 1);
String id = tmp.substring(MyDialog.注册_LENGTH, fstSplitPos),//提示用户ID
name = tmp.substring(fstSplitPos + 1, scndSplitPos),//提取用户NAME
pswd = tmp.substring(scndSplitPos + 1);//提取用户PASSWORD
tmp = client.发送注册数据包(id, name, pswd);
if (tmp.equals(MyConstants.注册结果_成功))
break;//回到登录界面
else if (tmp.equals(MyConstants.注册结果_用户id已经存在))
提示("用户id已经存在");
else if (tmp.equals(MyConstants.注册结果_其它错误))
提示("注册失败,未知错误");
else if (tmp.equals(MyConstants.注册结果_超时))
提示("注册失败,超时");
}
}
else//用户进行登录操作
{
int CommaPos = tmp.indexOf(MyConstants.SPLIT);
String id = tmp.substring(MyDialog.登录_LENGTH, CommaPos),
pswd = tmp.substring(CommaPos);
tmp = client.登录(id, pswd);
if (tmp.equals(MyConstants.登录结果_失败))
提示("登录失败");
else if (tmp.equals(MyConstants.登录结果_超时))
提示("登录超时");
else
break;//登录成功,进入下一操作
}
}
// 登录成功后发送“上线数据包”
client.发送上线数据包();
// 根据收到的“好友列表数据包”和“在线好友数据包”,显示、刷新好友界面
// 根据用户动作进行相应处理
// 启动接收数据包线程
thrdReceive = new Thread(this);
thrdReceive.setDaemon(true);
thrdReceive.start();
win.添加好友消息发送代理(this);
win.添加收尾动作监视器(this);
win.setVisible(true);
// System.runFinalizersOnExit(true);//不好用,申请的系统资源已被释放,再对它们操作会出错
}
public void run()
{
// 接收数据包
// 根据数据包的种类进行处理
String msg;
while(true)
{
msg = new String(client.读取数据包().getData()).trim();
try
{
((数据包处理类)数据包处理.get(msg.substring(0, MyConstants.LENGTH_OF_RULE))).performed(msg.substring(MyConstants.LENGTH_OF_RULE));
}
catch(Exception e)//收到错误的数据包就忽略它们
{
}
}
}
public static void main(String args[])
{
new Client_app();
}
public static void 提示(String s)
{
// System.out.println(s);
JOptionPane.showMessageDialog(null, s);
}
public void 好友消息发送(SocketAddress add, String msg)//实现发友消息发送代理的功能
{
client.发送好友消息数据包(add, msg);
}
public void 收尾动作()
{
thrdReceive.interrupt();
client.发送下线数据包();
System.exit(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -