我一直都想编一个自己的聊天软件,像QQ那种;最近有时间我就自己编了一个。编写的过程中收获很大……
现在拿出来跟大家分享,有兴趣的朋友可以和我交流交流。
先给大家看一下效果:
启动服务器:
再给大家看一下简陋的登录窗口/(ㄒoㄒ)/~~输入密码登录:
终于进入主题了O(∩_∩)O!客户端主界面:
Mary给Yuan发一个消息:
Yuan打开消息框进行回复:
我们再来看一下群发功能,群发首先得多叫几个好友上线,要不谁知道他们有没有收到……
188的好友们先把队形站好,接下来就等着188给你们发消息吧
这时候老大就要登场准备讲话了:
假设Marry有一天新认识一个好基友,那怎么添加好友呢?接下给给大家看一看添加好友功能:
那个陌生的好基友从哪来呢?不如现造一个(注册用户):
登录小花,Mary再添加小花为好友:
点击添加好友按钮,输入对方账号:
基友花花收到好友请求后,好友请求按钮就会被点亮,如果没有好友请求的话,这个按钮是失效的。
花花现在需要做的就是同意添加好友,当然,花花也有权拒绝,但是突然有妹子加好友,花花怎么会拒绝呢,(^o^)/~。
同意,Marry和花花就能开心地聊天了。
还有离线消息没给大家贴图:相比大家也看腻了吧,贴了这么多图,唯一的感触就是window的蓝色主题背景还真的挺好看的。O(∩_∩)O哈!
技术细节:
我编写的这个软件分三步分组成:数据库部分、服务器部分、客户端部分。实现的过程中采用MVC模式。
整个系统中的核心部分在于服务器端接收用户请求、解析请求、处理请求;客户端接收服务器消息、解析消息、处理并显示消息。
下面定义了本系统客户端与服务器端通信的请求码:
客户端请求码与服务器返回结果:
00:登录 例如:00:123,123 表示用户账号123,密码123请求登录;登录成功服务器会给客户端发送:
>>>00:123,123
>>>001:123,Tom;120,Yuan;124,John;&$119,123;&$120,123,2016-9-11 15:24:11,你好;120,123,2016-9-11 15:25:11,你好;120,123,2016-9-11 15:26:11,你好;
返回的信息被&$分成三段,第一段表示用户本身与好友列表,第二字段表示收到119申请添加好友的请求,第三段表示离线消息。每段内的记录以‘;’分隔;每条记录里的参数以‘,’分隔;
10:查询与指定好友的历史消息 10:120,119 表示查询120与119的聊天记录;返回示例:
>>>10,120,119
>>>101:120,119,2016-1-12 0:00:00,hello;120,119,2016-8-10 0:00:00,你好;120,119,2016-8-10 0:00:00,你好,我是120;120,119,2016-8-10
0:00:00,nihao;120,119,2016-8-10 0:00:00,nihao;120,119,2016-8-10 0:00:00,nihao;120,119,2016-8-10 0:00:00,213213;119,120,
2016-8-10 0:00:00,你好;119,120,2016-8-10 0:00:00,hello;119,120,2016-8-10 0:00:00,Hi;119,120,2016-8-10 0:00:00,hello
;119,120,2016-8-10 0:00:00,hi;119,120,2016-8-10 0:00:00,哈哈; 每条历史消息以‘;’为间隔。
11:点对点发msg 11:120,119,2016-7-16 10:10:10,hello 表示120给119发送点对点消息“hello”,时间为2016-7-16 10:10:10
12:群发好友msg 12:120,120,2016-7-16 11:11:11,大家好,我是120 表示120给所有好友群发消息,与点对点发消息有所不同的是这里的接收方发送方都是自己账号;
13:删除历史消息 13:120,119 表示120请求删除与119的聊天记录;这里需要注意的一点是,用户删除聊天记录是仅仅是把数据库中消息表中的d字段置0了,用户查询历史聊天记录时也会检查d字段,对于那些d字段为0的消息是检索不到的,就好像自己把它已经删除了一样;
20:获得好友列表 20:120 表示请求120的好友列表
>>>20:120
>>>201:122,Yaze;123,Tom;130,M;
21:添加好友 21:120,130 表示120请求添加130为好友,服务器端就会根据可以请求在数据库表failrelation(未确认好友关系表)中创建一条记录;
22:删除好友 22:120,119 表示120删除好友119,服务器端根据请求会在relation表中删除相应记录,并对在用用户进行通知;
23:确认添加好友 23:130,120 表示130同意添加120为好友,服务器端会删除相应的failrelation记录,并在relation中添加一个记录(添加时调整id顺序,使其检索方便,这里是使数值小的id放在前面);
24:拒绝添加好友
30:更改用户名 30:120,Yozane,120 表示把账号120的用户名更改为Yozane,返回修改后的用户信息
>>>30:152,jiaGu,170
>>>301:152,jiaGu,170
31:更改用户密码 30:120,新密码,旧密码
>>>31:152,152,170
>>>301:152,jiaGu,152
40:注册新用户 40:Tommy,130 表示申请注册用户名为Tommy,密码为130的用户。
示例:
>>>40:Jia,170
>>>401:152,Jia,170
数据库转储文件(结构与数据)数据库名为superqq:
/* Navicat MySQL Data Transfer Source Server : courseregis Source Server Version : 50022 Source Host : localhost:3306 Source Database : superqq Target Server Type : MYSQL Target Server Version : 50022 File Encoding : 65001 Date: 2016-07-21 21:46:12 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for failmessage -- ---------------------------- DROP TABLE IF EXISTS `failmessage`; CREATE TABLE `failmessage` ( `id1` bigint(10) NOT NULL, `id2` bigint(10) default NULL, `time` datetime default NULL, `content` varchar(140) default NULL, `id` bigint(20) NOT NULL auto_increment, PRIMARY KEY (`id`), KEY `f3` USING BTREE (`id1`), KEY `f4` USING BTREE (`id2`), CONSTRAINT `failmessage_ibfk_1` FOREIGN KEY (`id1`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `failmessage_ibfk_2` FOREIGN KEY (`id2`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='InnoDB free: 3072 kB; (`id1`) REFER `superqq/user`(`id`) ON '; -- ---------------------------- -- Records of failmessage -- ---------------------------- INSERT INTO `failmessage` VALUES ('119', '150', '2016-08-17 10:52:17', '你好', '4'); INSERT INTO `failmessage` VALUES ('119', '150', '2016-08-17 10:52:17', '你好', '5'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:43:17', '你好', '11'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:43:17', '你好', '15'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:44:17', '你好', '19'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:44:17', '你好', '23'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:44:17', '你好', '27'); INSERT INTO `failmessage` VALUES ('119', '150', '2016-08-17 14:44:17', '你好', '31'); INSERT INTO `failmessage` VALUES ('119', '150', '2016-08-17 14:48:17', '大家好', '32'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:49:17', '大家好', '33'); INSERT INTO `failmessage` VALUES ('119', '150', '2016-08-17 14:49:17', '大家好', '37'); INSERT INTO `failmessage` VALUES ('120', '122', '2016-08-17 14:56:17', '你好', '38'); INSERT INTO `failmessage` VALUES ('121', '122', '2016-08-18 07:55:18', 'NIHAO', '44'); INSERT INTO `failmessage` VALUES ('188', '170', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '46'); INSERT INTO `failmessage` VALUES ('188', '172', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '47'); INSERT INTO `failmessage` VALUES ('188', '173', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '48'); INSERT INTO `failmessage` VALUES ('188', '187', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '49'); -- ---------------------------- -- Table structure for failrelation -- ---------------------------- DROP TABLE IF EXISTS `failrelation`; CREATE TABLE `failrelation` ( `id1` bigint(10) NOT NULL, `id2` bigint(10) NOT NULL, PRIMARY KEY (`id1`,`id2`), KEY `f2` USING BTREE (`id2`), CONSTRAINT `failrelation_ibfk_1` FOREIGN KEY (`id1`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `failrelation_ibfk_2` FOREIGN KEY (`id2`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='InnoDB free: 3072 kB; (`id1`) REFER `superqq/user`(`id`) ON '; -- ---------------------------- -- Records of failrelation -- ---------------------------- INSERT INTO `failrelation` VALUES ('123', '150'); INSERT INTO `failrelation` VALUES ('180', '170'); INSERT INTO `failrelation` VALUES ('187', '185'); INSERT INTO `failrelation` VALUES ('185', '187'); -- ---------------------------- -- Table structure for message -- ---------------------------- DROP TABLE IF EXISTS `message`; CREATE TABLE `message` ( `id1` bigint(10) NOT NULL, `id2` bigint(10) NOT NULL, `time` datetime NOT NULL, `content` varchar(140) NOT NULL, `id` bigint(20) NOT NULL auto_increment, `d1` bit(1) default '', `d2` bit(1) default '', PRIMARY KEY (`id`), KEY `f3` (`id1`), KEY `f4` (`id2`), CONSTRAINT `f3` FOREIGN KEY (`id1`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `f4` FOREIGN KEY (`id2`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of message -- ---------------------------- INSERT INTO `message` VALUES ('119', '120', '2016-07-07 10:42:13', 'hello 120 I'm 119', '1', '', '0'); INSERT INTO `message` VALUES ('121', '120', '2016-07-06 10:42:37', 'hello 120 I'm 121', '2', '', '