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

📄 client_app.java

📁 用JAVA写的qq,为qq的跨平台使用提供了可能,一直都很讨厌tencent不为linux提供方便,自己写了一个qq,希望有人继续完善,我现在没空做了
💻 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 + -