zoukankan      html  css  js  c++  java
  • ICQ

    我一直都想编一个自己的聊天软件,像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', '', '');
    INSERT INTO `message` VALUES ('120', '123', '2016-08-04 10:43:09', 'hello 123 I'm 120', '3', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2017-12-09 00:00:00', 'test insert time.', '4', '0', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-07-27 14:00:48', 'hello ', '5', '', '0');
    INSERT INTO `message` VALUES ('119', '120', '2016-07-31 14:01:10', 'hello', '6', '', '0');
    INSERT INTO `message` VALUES ('120', '119', '2016-07-08 15:39:49', 'hello', '7', '0', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-07-08 15:43:53', 'hello test date', '8', '', '0');
    INSERT INTO `message` VALUES ('119', '120', '2016-07-08 15:45:59', 'hello test date', '9', '', '0');
    INSERT INTO `message` VALUES ('119', '120', '2016-07-08 15:46:08', 'hello test date', '10', '', '0');
    INSERT INTO `message` VALUES ('119', '120', '2016-07-08 15:46:43', 'hello test date', '11', '', '0');
    INSERT INTO `message` VALUES ('120', '124', '2016-07-22 17:47:53', '', '12', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2015-03-03 12:13:14', 'nihao', '13', '0', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-10-08 10:12:11', '120群发信息。', '14', '0', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 14:05:10', '213213', '15', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:34:10', '你好--', '18', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:37:10', 'hHh', '19', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:39:10', 'HH', '20', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:42:10', '而且为二次', '21', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:43:10', '年后', '22', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:46:10', '哈哈', '23', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 17:49:10', '哈哈', '24', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 10:11:11', 'nihao', '25', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 18:12:10', '你好', '26', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 10:11:10', 'nihao', '27', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 10:11:10', 'nihao', '28', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 10:11:10', 'nihao', '29', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 10:11:10', 'nihao', '30', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 18:20:10', '你好', '31', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 18:21:10', '年号', '32', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 18:22:10', 'niaoj', '33', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 18:22:10', '090', '34', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 18:25:10', '你好', '35', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-10 19:16:10', 'NIHAO', '36', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-10 19:16:10', 'NIHAO', '37', '', '');
    INSERT INTO `message` VALUES ('121', '122', '2016-08-10 19:43:10', 'njkfds', '38', '', '');
    INSERT INTO `message` VALUES ('121', '122', '2016-08-10 19:43:10', 'fjskadljf dsa', '39', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 10:44:11', '你哈', '40', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 10:45:11', '哈哈', '41', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 10:45:11', '你好哈', '42', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:12:11', '你好', '43', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:13:11', '我很好', '44', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:13:11', '年号', '45', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:14:11', '大家好', '46', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:14:11', '你好O', '47', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:29:11', '你好', '48', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:29:11', '你好', '49', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:30:11', '你好', '50', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:30:11', '你好', '51', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:30:11', '你哈', '52', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:30:11', '', '53', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:30:11', '', '54', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:30:11', '', '55', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:33:11', '哈哈', '56', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:33:11', '你好', '57', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:33:11', '地方', '58', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:33:11', '', '59', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:38:11', '年后', '60', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:40:11', '年后', '61', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:42:11', '你好', '62', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:47:11', '你好', '63', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:49:11', '你好', '64', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:50:11', '你哈', '65', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:50:11', '你好', '66', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:50:11', '你好', '67', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:50:11', ' 你好', '68', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:50:11', '你好', '69', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:51:11', '你好', '70', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-11 11:51:11', '你好', '71', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:51:11', '你好', '72', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:51:11', '你好', '73', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:51:11', '你好', '74', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:51:11', '你好', '75', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 11:51:11', '你好', '76', '', '');
    INSERT INTO `message` VALUES ('120', '120', '2016-08-11 14:56:11', '大家好我是Yuan', '77', '', '');
    INSERT INTO `message` VALUES ('122', '122', '2016-08-11 14:59:11', '大家好', '78', '', '');
    INSERT INTO `message` VALUES ('122', '121', '2016-08-11 15:01:11', '你好', '79', '', '');
    INSERT INTO `message` VALUES ('122', '121', '2016-08-11 15:01:11', '你好', '80', '', '');
    INSERT INTO `message` VALUES ('122', '121', '2016-08-11 15:01:11', '你哈', '81', '', '');
    INSERT INTO `message` VALUES ('121', '122', '2016-08-11 15:01:11', '', '82', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-11 15:26:11', '你哈', '83', '', '');
    INSERT INTO `message` VALUES ('120', '120', '2016-08-11 15:28:11', '大家好', '84', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-01-12 10:10:12', 'hello', '85', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-08 10:02:08', 'hello', '86', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2017-01-12 10:12:12', 'hello', '87', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2017-01-12 10:02:12', 'hello', '88', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2017-01-12 10:02:12', 'hello', '89', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2017-01-12 10:02:12', 'hello', '90', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2017-01-12 10:02:12', 'hello', '91', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-04 05:05:04', 'hello', '92', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 10:02:17', 'hello', '93', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-04 05:05:04', 'hello', '94', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-04 05:05:04', 'hello', '95', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-04 05:05:04', 'hello', '96', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-04 05:05:04', 'hello', '97', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 10:03:17', 'hello', '98', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2017-01-12 10:02:12', 'hello', '99', '', '');
    INSERT INTO `message` VALUES ('120', '120', '2016-08-17 10:05:17', '大家好我是120', '100', '', '');
    INSERT INTO `message` VALUES ('120', '120', '2016-08-17 10:06:17', '大家好', '101', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-01 05:04:01', '大家好', '102', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 10:09:17', '大家好', '103', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 10:09:17', '大家好', '104', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 10:41:17', '你好', '105', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:29:17', '你好', '106', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:29:17', '你好', '107', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:29:17', '你好', '108', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:30:17', '你好', '109', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:30:17', '你好', '110', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:30:17', '你好', '111', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:30:17', '大家好', '112', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 11:30:17', '大家好', '113', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:31:17', '你好', '114', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:40:17', '你好', '115', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:40:17', '你好', '116', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:41:17', '你好', '117', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:41:17', '你好', '118', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:41:17', '你好', '119', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 11:41:17', '你好', '120', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:42:17', '不好', '121', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:42:17', '你好', '122', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:43:17', '你好', '123', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:43:17', '我是119', '124', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 11:51:17', '你好', '125', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 12:07:17', '你好', '126', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 12:07:17', '你好', '127', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 12:07:17', '你好', '128', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 12:07:17', '你好', '129', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 14:42:17', '你好', '130', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:42:17', '你好', '131', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:43:17', '你好', '132', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:43:17', '你好', '133', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:43:17', '你好', '134', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:43:17', '你好', '135', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:43:17', '你好', '136', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:43:17', '你好', '137', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:44:17', '你好', '138', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:44:17', '你好', '139', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:44:17', '你好', '140', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:44:17', '你好', '141', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:44:17', '你好', '142', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:44:17', '你好', '143', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 14:44:17', '你好', '144', '', '');
    INSERT INTO `message` VALUES ('153', '120', '2017-01-01 05:04:01', '大家好', '145', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 14:48:17', '大家好', '146', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:49:17', '大家好', '147', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:49:17', '大家好', '148', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 14:49:17', '大家好', '149', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 14:49:17', '大家好', '150', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-17 14:55:17', '你好', '151', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-17 14:56:17', '你好', '152', '', '');
    INSERT INTO `message` VALUES ('120', '153', '2016-08-17 14:56:17', '你好', '153', '', '');
    INSERT INTO `message` VALUES ('119', '121', '2016-08-18 07:53:18', 'NIHAO', '154', '', '');
    INSERT INTO `message` VALUES ('121', '119', '2016-08-18 07:55:18', 'NIHAO', '155', '', '');
    INSERT INTO `message` VALUES ('119', '121', '2016-08-18 07:55:18', 'NIAHO', '156', '', '');
    INSERT INTO `message` VALUES ('119', '188', '2016-08-18 07:56:18', '你好', '157', '', '');
    INSERT INTO `message` VALUES ('166', '120', '2016-08-21 11:24:21', '你好', '158', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-21 11:28:21', '你好', '159', '', '');
    INSERT INTO `message` VALUES ('190', '120', '2016-08-21 12:08:21', '你好', '160', '', '');
    INSERT INTO `message` VALUES ('188', '173', '2016-08-21 12:56:21', '你好', '161', '', '');
    INSERT INTO `message` VALUES ('120', '119', '2016-08-21 15:10:21', '你好', '162', '', '');
    INSERT INTO `message` VALUES ('119', '120', '2016-08-21 15:11:21', '你好', '163', '', '');
    INSERT INTO `message` VALUES ('188', '120', '2016-08-21 20:51:21', '你好,我是Mary', '164', '', '');
    INSERT INTO `message` VALUES ('120', '188', '2016-08-21 20:55:21', '收到,我是Yuan', '165', '', '');
    INSERT INTO `message` VALUES ('188', '119', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '166', '', '');
    INSERT INTO `message` VALUES ('188', '120', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '167', '', '');
    INSERT INTO `message` VALUES ('188', '123', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '168', '', '');
    INSERT INTO `message` VALUES ('188', '190', '2016-08-21 21:07:21', '筒子们,大家好,大家辛苦了', '169', '', '');
    
    -- ----------------------------
    -- Table structure for relation
    -- ----------------------------
    DROP TABLE IF EXISTS `relation`;
    CREATE TABLE `relation` (
      `id1` bigint(10) NOT NULL,
      `id2` bigint(10) NOT NULL,
      PRIMARY KEY  (`id1`,`id2`),
      KEY `f2` (`id2`),
      CONSTRAINT `f1` FOREIGN KEY (`id1`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `f2` FOREIGN KEY (`id2`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of relation
    -- ----------------------------
    INSERT INTO `relation` VALUES ('119', '120');
    INSERT INTO `relation` VALUES ('120', '120');
    INSERT INTO `relation` VALUES ('119', '121');
    INSERT INTO `relation` VALUES ('120', '122');
    INSERT INTO `relation` VALUES ('121', '122');
    INSERT INTO `relation` VALUES ('119', '123');
    INSERT INTO `relation` VALUES ('120', '123');
    INSERT INTO `relation` VALUES ('120', '124');
    INSERT INTO `relation` VALUES ('123', '124');
    INSERT INTO `relation` VALUES ('120', '125');
    INSERT INTO `relation` VALUES ('121', '125');
    INSERT INTO `relation` VALUES ('119', '130');
    INSERT INTO `relation` VALUES ('120', '130');
    INSERT INTO `relation` VALUES ('120', '140');
    INSERT INTO `relation` VALUES ('119', '150');
    INSERT INTO `relation` VALUES ('120', '153');
    INSERT INTO `relation` VALUES ('120', '160');
    INSERT INTO `relation` VALUES ('123', '160');
    INSERT INTO `relation` VALUES ('120', '165');
    INSERT INTO `relation` VALUES ('120', '166');
    INSERT INTO `relation` VALUES ('120', '169');
    INSERT INTO `relation` VALUES ('155', '169');
    INSERT INTO `relation` VALUES ('120', '170');
    INSERT INTO `relation` VALUES ('169', '172');
    INSERT INTO `relation` VALUES ('172', '173');
    INSERT INTO `relation` VALUES ('120', '177');
    INSERT INTO `relation` VALUES ('120', '181');
    INSERT INTO `relation` VALUES ('180', '181');
    INSERT INTO `relation` VALUES ('120', '187');
    INSERT INTO `relation` VALUES ('119', '188');
    INSERT INTO `relation` VALUES ('120', '188');
    INSERT INTO `relation` VALUES ('123', '188');
    INSERT INTO `relation` VALUES ('170', '188');
    INSERT INTO `relation` VALUES ('172', '188');
    INSERT INTO `relation` VALUES ('173', '188');
    INSERT INTO `relation` VALUES ('187', '188');
    INSERT INTO `relation` VALUES ('119', '189');
    INSERT INTO `relation` VALUES ('120', '189');
    INSERT INTO `relation` VALUES ('120', '190');
    INSERT INTO `relation` VALUES ('180', '190');
    INSERT INTO `relation` VALUES ('120', '191');
    INSERT INTO `relation` VALUES ('191', '192');
    INSERT INTO `relation` VALUES ('188', '194');
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` bigint(10) NOT NULL auto_increment,
      `name` varchar(20) default NULL,
      `pwd` varchar(32) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('119', 'Jiaxin', '7e1cd7dca89a1678042477183b7ac3f');
    INSERT INTO `user` VALUES ('120', 'Yuan', 'c6f057b86584942e415435ffb1fa93d4');
    INSERT INTO `user` VALUES ('121', 'Xuewei', '4c56ff4ce4aaf9573aa5dff913df997a');
    INSERT INTO `user` VALUES ('122', 'Yaze', 'a0a080f42e6f13b3a2df133f073095dd');
    INSERT INTO `user` VALUES ('123', 'Tom', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('124', 'John', 'c8ffe9a587b126f152ed3d89a146b445');
    INSERT INTO `user` VALUES ('125', 'Yunchen', '3def184ad8f4755ff269862ea77393dd');
    INSERT INTO `user` VALUES ('130', 'M', '9b8619251a19057cff70779273e95aa6');
    INSERT INTO `user` VALUES ('132', 'Silly', '65ded5353c5ee48d0b7d48c591b8f430');
    INSERT INTO `user` VALUES ('133', 'Tikky', '9fc3d7152ba9336a670e36d0ed79bc43');
    INSERT INTO `user` VALUES ('140', '140', '1385974ed5904a438616ff7bdb3f7439');
    INSERT INTO `user` VALUES ('150', 'Mary', '7ef605fc8dba5425d6965fbd4c8fbe1f');
    INSERT INTO `user` VALUES ('151', 'Yane', 'b73ce398c39f506af761d2277d853a92');
    INSERT INTO `user` VALUES ('152', 'jiaGu', '37a749d808e46495a8da1e5352d03cae');
    INSERT INTO `user` VALUES ('153', 'YY', 'da4fb5c6e93e74d3df8527599fa62642');
    INSERT INTO `user` VALUES ('154', 'Yane', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('155', 'Yanem', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('156', 'Y', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('157', 'YY', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('158', 'ZZ', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('159', 'X', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('160', 'X', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('161', 'te', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('162', 'Marry', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('163', 'Marry', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('164', 'Gray', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('165', 'Y', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('166', 'Velly', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('167', 'Harry', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('168', 'Harry', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('169', 'Harry', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('170', 'Harry', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('171', 'Harry', 'c20ad4d76fe97759aa27a0c99bff6710');
    INSERT INTO `user` VALUES ('172', 'Harray', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('173', 'Hyne', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('174', 'Hyne', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('175', 'Ted', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('176', 'Ted', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('177', 'Ted', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('178', 'Ted', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('179', 'Ted', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('180', 'Tedr', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('181', 'Tedr', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('182', 'Ted', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('183', 'YaneZane', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('184', 'YaneZanen', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('185', 'Trne', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('187', 'Tone', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('188', 'Mary', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('189', 'Hery', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('190', 'Tommas', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('191', 'Johnson', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('192', '刘远圳', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('193', 'Torrorrent', '202cb962ac59075b964b07152d234b70');
    INSERT INTO `user` VALUES ('194', '基友小花', '202cb962ac59075b964b07152d234b70');
    View Code

    数据库操作类dao.java:

    package dao;
    
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Vector;
    
    import model.message;
    import model.relation;
    import model.user;
    public class dao{
        static String username="root";
        static String pwd = "";
        static String url = "jdbc:mysql://127.0.0.1:3306/superqq"; 
        static String driver = "org.gjt.mm.mysql.Driver";
        static Connection con;
        static Statement statement;
        public dao(){}
        public static void main(String[] args){
            dao d =  new dao();
        }
        private static Date convertToDate(String str){//用于将sql.date转化为util.date
            String[] li = str.split(" ");
            if(li.length!=2){
                System.out.println("converToDate 出错,空格错误");
                return new Date();
            }
            String[] para = li[0].split("-");
            String[] para1 = li[1].split(":");
            return new GregorianCalendar(new Integer(para[0]).intValue(),new Integer(para[1]).intValue(),new Integer(para[2]).intValue(),new Integer(para1[0]).intValue(),new Integer(para1[1]).intValue(),new Integer(para[2]).intValue()).getTime();        
        }
        private void start(){
            try {
                Class.forName( driver );
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                System.out.println("error in loading driver.");
            }
            try {
                con = DriverManager.getConnection(url,username,pwd);
                statement = con.createStatement();      
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in connect database.");
            }     
        }
        private void close(){
            try {
                statement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in close statement.");
            } 
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in close connection.");
            }
        }
        public user getUser(String id){
            start();
            List<user> li = new LinkedList<user>();
            try {
                ResultSet re = statement.executeQuery("select * from user where id ="+id+";");
                while(re.next()){
                    li.add(new user(re.getString(1),re.getString(2),re.getString(3)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getUser("+id+")");
            } 
            finally{close();}
            return li.get(0);
        }
        public user getUser(String name,String pwd){
            start();
            List<user> li = new LinkedList<user>();
            try {
                ResultSet re = statement.executeQuery("select * from user where name ='"+name+"';");
                while(re.next()){
                    li.add(new user(re.getString(1),re.getString(2),re.getString(3)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getUser("+name+","+pwd+")");
            } 
            finally{close();}
            if(li.size()!=0){
                return li.get(0);    
            }else{
                return null;
            }
        }
        public List<relation> getRelation(String id){
            start();
            List<relation> li = new LinkedList<relation>();
            try {
                statement = con.createStatement();  
                ResultSet re = statement.executeQuery("select * from relation where id1 ="+id+"||id2 ="+id+";");
                while(re.next()){
                    li.add(new relation(re.getString(1),re.getString(2)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getRelation("+id+")");
            } 
            finally{close();}
            return li;
        }
    
        public List<user> getUserList(){
            start();
            List<user> li=new LinkedList<user>();
            ResultSet re;
            try {
                re = statement.executeQuery("select * from user;");
                while(re.next()){
                    li.add(new user(re.getString(1),re.getString(2),re.getString(3)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally{close();}
            return li;
        }
        public Boolean addUser(user u){
            start();
            Boolean flag = true;
            try {
                statement.execute("insert into user(name,pwd) values('"+u.getUsername()+"','"+u.getPwd()+"');");
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in addUser:"+u);
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public Boolean deleteUser(String id){
            start();
            Boolean flag = true;
            try {
                statement.execute("delete from user where id ='"+id+"';");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in deleteUser:id="+id);
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public Boolean updateUser(user u){
            start();
            Boolean flag=true;
            try {
                statement.execute("update user set name='"+u.getUsername()+"',pwd ='"+u.getPwd()+"' where id ='"+u.getId()+"';");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in update:"+u);
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public Boolean updatePwd(user u){
            start();
            Boolean flag=true;
            try {
                statement.execute("update user set pwd='"+u.getUsername()+"' where id ='"+u.getId()+"';");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in updatepwd:"+u);
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public List<relation> getRelation(){
            start();
            List<relation> li=new LinkedList<relation>();
            ResultSet re;
            try {
                re = statement.executeQuery("select * from relation;");
                while(re.next()){
                    li.add(new relation(re.getString(1),re.getString(2)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getRelation().");
            }
            finally{close();}
            return li;
        }
        public Boolean addRelation(relation r){//先对id1,id2排序,再插入
            start();
            Boolean flag = true;
            try {
                String id1 = r.getId1();
                String id2 = r.getId2();
                if(new Integer(id1).intValue()>new Integer(id2).intValue()){
                    String id = id1;
                    id1 = id2;
                    id2 = id;
                }
                statement.execute("insert into relation(id1,id2) values('"+id1+"','"+id2+"');");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in addRelation:"+r);
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public Boolean deleteRelation(relation r){//确保id有序(非减)
            start();
            Boolean flag = true;
            try {
                String id1 = r.getId1();
                String id2 = r.getId2();
                if(new Integer(id1).intValue()>new Integer(id2).intValue()){
                    String id = id1;
                    id1 = id2;
                    id2 = id;
                }
                statement.execute("delete from relation where id1 = '"+id1+"'&&id2 ='"+id2+"';");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in deleteRelation("+r+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public List<relation> getFailRelation(String id){
            start();
            List<relation> li=new LinkedList<relation>();
            ResultSet re;
            try {
                re = statement.executeQuery("select * from failrelation where id2 = '"+id+"';");
                while(re.next()){
                    li.add(new relation(re.getString(1),re.getString(2)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getFailRelation:id="+id);
            }
            finally{close();}
            return li;
        }
        public Boolean addFailRelation(relation r){
            start();
            Boolean flag =true;
            try {
                statement.execute("insert into failrelation(id1,id2) values('"+r.getId1()+"','"+r.getId2()+"');");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in addFailRelation("+r+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public Boolean deleteFailRelation(relation r){
            start();
            Boolean flag = true;
            try {
                statement.execute("delete from failrelation where (id1='"+r.getId1()+"'&&id2 ='"+r.getId2()+"')||(id1='"+r.getId2()+"'&&id2='"+r.getId1()+"');");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in deleteFailRelation("+r+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public List<user> getFriend(String id){
            start();
            List<user> li=new LinkedList<user>();
            ResultSet re;
            try {
                re = statement.executeQuery("select user.id,user.name from user,relation where (relation.id1 = '"+id+"'&&relation.id2 = user.id )||(relation.id2 = '"+id+"'&&relation.id1 = user.id);");
                while(re.next()){
                    li.add(new user(re.getString(1),re.getString(2)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getFriend("+id+").");
            }
            finally{close();}
            return li;
        }
        public Boolean addmessage(message msg){
            start();
            Boolean flag = true;
            try {
                statement.execute("insert into message(id1,id2,time,content) values('"+msg.getId1()+"','"+msg.getId2()+"','"+msg.getDate().toLocaleString()+"','"+msg.getContent()+"');");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("error in addmessage("+msg+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public List<message> getfailmessage(String id){
            start();
            List<message> li=new LinkedList<message>();
            ResultSet re;
            try {
                re = statement.executeQuery("select * from failmessage where id2 = '"+id+"';");
                while(re.next()){
                    Date date = convertToDate(re.getString(3));
                    li.add(new message(re.getString(1),re.getString(2),date,re.getString(4)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getfailmessage("+id+").");
            }
            finally{close();}
            return li;
        }
        public  Boolean addfailmessage(message msg){
            start();
            Boolean flag =true;
            try {
                statement.execute("insert into failmessage(id1,id2,time,content) values('"+msg.getId1()+"','"+msg.getId2()+"','"+msg.getDate().toLocaleString()+"','"+msg.getContent()+"');");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in addfailmessage("+msg+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public  Boolean deletefailmessage(message msg){//待修正--应用id确定被删除离线消息
            start();
            Boolean flag = true;
            try {
                statement.execute("delete from failmessage where id1 = '"+msg.getId1()+"'&&id2 ='"+msg.getId2()+"';");            
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in deletefailmessage("+msg+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public List<message> getMessage(){
            start();
            List<message> li=new LinkedList<message>();
            ResultSet re;
            try {
                re = statement.executeQuery("select * from message;");
                while(re.next()){
                    li.add(new message(re.getString(1),re.getString(2),re.getDate(3),re.getString(4)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getMessage().");
            }
            finally{close();}
            return li;
        }
        public List<message> getMessage(String id){
            start();
            List<message> li = new LinkedList<message>();
            try {
                ResultSet re = statement.executeQuery("select * from message where id1 ="+id+";");
                while(re.next()){
                    String str = re.getString(3);
                    Date date = new GregorianCalendar(new Integer(str.substring(0,4)).intValue(),new Integer(str.substring(5, 7)).intValue(),new Integer(str.substring(8, 10)).intValue(),new Integer(str.substring(11, 13)).intValue(),new Integer(str.substring(14, 16)).intValue(),new Integer(str.substring(17, 19)).intValue()).getTime();
                    li.add(new message(re.getString(1),re.getString(2),date,re.getString(4)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in getMessage("+id+")");
            }     
            return li;        
        }
        public List<message> getMessage(String id1,String id2){//注意顺序,id1 查询与 id2的聊天记录。
            start();
            List<message> li=new LinkedList<message>();
            ResultSet re;
            try {
                re = statement.executeQuery("select * from message where (d1=1&&id1='"+id1+"'&&id2='"+id2+"')||(d2=1&&id1='"+id2+"'&&id2='"+id1+"') order by time ASC;");
                while(re.next()){
                    li.add(new message(re.getString(1),re.getString(2),re.getDate(3),re.getString(4)));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("error in getMessage("+id1+","+id2+").");
            }
            finally{close();}
            return li;
        }
        public Boolean deleteMessage(String id1,String id2){
            start();
            Boolean flag = true;
            try {
                statement.execute("update message set d1 = 0 where id1 ='"+id1+"'&&id2='"+id2+"';");
                statement.execute("update message set d2 = 0 where id2 ='"+id1+"'&&id1='"+id2+"';");
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("error in deleteMessage("+id1+","+id2+").");
                flag = false;
            }
            finally{close();}
            return flag;
        }
        public void md(){
            start();
            try{
                ResultSet re=statement.executeQuery("select id,pwd from user;");
                Vector<String> id=new Vector<String>();
                Vector<String> pwd=new Vector<String>();
                while(re.next()){
                    id.add(re.getString(1));
                    pwd.add(re.getString(2));
                }
                re.close();
                while(!id.isEmpty()){
                    statement.execute("update user set pwd='"+encryp(pwd.remove(0))+"' where id='"+id.remove(0)+"';");
                }
            }catch(SQLException e){
                e.printStackTrace();
            }
            finally{
                close();
            }
            return;
        }
        public String encryp(String pwd){
            byte[] message=null;
            message = pwd.getBytes();
            MessageDigest md=null;
            try {
                md = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            byte[] encrypwd =md.digest(message);
            BigInteger bigInteger = new BigInteger(1, encrypwd);
            return bigInteger.toString(16);
        }    
    }
    View Code

    服务器端程序Server.java

    package control;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.sql.SQLException;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.logging.Logger;
    
    import model.message;
    import model.relation;
    import model.user;
    import dao.dao;
    
    public class Server implements Runnable{
        List<user> li = new LinkedList<user>();//在线用户列表
        List<Socket> li_socket = new LinkedList<Socket>();
        ServerSocket server;
        Socket socket ;
        Object lock = new Object();
        Logger Log = Logger.getGlobal();
        public Server(int port,int queueLength){
            try{
                server = new ServerSocket(port,queueLength);//port,queueLength
            }catch(Exception e){}
            System.out.println("服务器创建成功。");
        }
        
        public List<user> getLi() {
            return li;
        }
    
        public void start(){
            System.out.println("服务器已启动……"+server);
            while(true){
                try{
                    socket = server.accept();//系统在这里等待连接    
                    new Thread(this).start();
                    System.out.println(socket.getInetAddress()+"连接服务器成功。");
                }catch(Exception e){
                    System.out.println("server error");
                    try{
                        socket.close();
                    }catch(Exception ee){}
                    close();
                }
            }
        }
        //主循环,根据请求码处理用户请求
        public void run(){//线程处理代码段,用以监听与客户端的连接。
            Socket socket = this.socket;
            BufferedReader input;
            PrintWriter output;
            String str = "";
            try {
                input =new BufferedReader( new InputStreamReader(socket.getInputStream()));//线程在这里等待输入流    
                output =new PrintWriter( new OutputStreamWriter(socket.getOutputStream()),true);    
                while(true){
                    //00:登录
                    //10:查询与指定好友的历史消息
                    //11:点对点发msg
                    //12:群发好友msg
                    //13:删除历史消息
                    //20:获得好友列表
                    //21:添加好友
                    //22:删除好友
                    //23:确认添加好友
                    //24:拒绝好友请求
                    //30:更新用户信息
                    //40:注册新用户    
                    Thread.sleep(1000);
                    try{
                        str = input.readLine();
                        System.out.println("服务器收到:"+str);
                    }catch(Exception e){
                        socket.close();
                        System.out.println("监听断开");
                        break;
                    }
                    String cmd="";
                    if(str!=null&&str.length()>2){
                        cmd= str.substring(0,2);    
                    }
                    synchronized (lock) {//synchronized
                    try{
                    checkStatus();
                    switch(cmd){
                    case "00":{//处理结果:给客户端发送用户与朋友信息;登录
                        str = str.substring(3).trim();
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数错误。");
                            output.println("000");
                            break;
                        }
                        String id = para[0];
                        String pwd = para[1];
                        user u = new user(id,"*",pwd);
                        if(login(u)){
                            System.out.println(u+"	 登录成功。");
                            u = getUser(u.getId());
                            li.add(u);
                            li_socket.add(socket);
                            List<user> f_li = getFriend(id);
                            String str_f = u.getId()+","+u.getUsername()+";";
                            for(user each:f_li){
                                str_f = str_f + each.getId()+","+each.getUsername()+";";
                            }
                            List<relation> li_r = this.getFailRelation(id);
                            String str_r ="";
                            for(relation r:li_r){
                                str_r = str_r +r.toString()+";";
                            }
                            List<message> li_m = this.getfailmessage(id);
                            String str_m = "";
                            for(message msg:li_m){
                                str_m =str_m+msg.toString()+";";
                            }
                            str = "001:"+str_f+"&$"+str_r+"&$"+str_m;
                            output.println(str);
                            for(message msg:li_m){
                                deletefailmessage(msg);
                            }
                            System.out.println("登录处理完成:"+str);
                        }else{
                            output.println("000");
                            System.out.println(id+"	登录失败");
                        }
                    };break;
                    case "10":{//发送聊天记录序列,查询与指定好友的历史消息
                        str = str.substring(3).trim();
                        String para[] = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数错误。");
                            output.println("100");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        System.out.println("10:查询与指定好友聊天记录。"+id1+","+id2);
                        List<message> m_li = this.getMessage(id1, id2);
                        String m_str ="";
                        for(message msg:m_li){
                            m_str =m_str + msg.toString()+";";
                        }
                        output.println("101:"+m_str);
                        System.out.println("聊天记录查询成功:"+m_str);
                    };break;
                    case "11":{//点对点发msg
                        System.out.println("点对点msg.");
                        str = str.substring(3).trim();
                        String[] para = str.split(",");
                        if(para.length!=4){
                            System.out.println("参数不匹配。");
                            output.println("110");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        System.out.println("para[2]:"+para[2]);
                        Date date =convertToDate(para[2]);
                        System.out.println("date:"+date);
                        String content = para[3];
                        message msg = new message(id1,id2,date,content);
                        if(send(id2,"111:"+msg.toString())){
                            System.out.println("转发成功:"+msg.toString());
                            addmessage(msg);//发送成功后把消息存入数据库
                            break;
                        }else{
                            System.out.println("目标用户未在线。");
                            this.addfailmessage(msg);//发送不成功存入离线记录表
                            System.out.println("转至离线消息");
                        }
                    };break;
                    case "12":{//群发好友msg
                        System.out.println("12:群发好友信息。");
                        str = str.substring(3).trim();
                        String[] para = str.split(",");
                        if(para.length!=4||!para[0].equals(para[1])){
                            System.out.println("参数不匹配。");
                            output.println("120");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        Date date = convertToDate(para[2]);
                        String content = para[3];
                        List<user> li_f = getFriend(id1);
                        message msg = new message(id1,id2,date,content);
                        for(int i=0;i<li_f.size();i++){
                            //Boolean flag = false;
                            id2 = li_f.get(i).getId();
                            msg.setId2(id2);
                            if(send(id2,"121:"+msg.toString())){
                                addmessage(msg);
                                System.out.println("群发消息至"+id2+"成功。");
                            }else{
                                addfailmessage(msg);
                                System.out.println("转至离线消息:"+msg);
                            }
                        }
                        //socket = socket_temp;
                        output.println("121");
                        System.out.println("群发消息处理成功。");
                    };break;
                    case "13":{//删除历史消息
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数不匹配。");
                            output.println("130");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        if(deleteMessage(id1,id2)){
                            System.out.println("历史消息清空:"+id1+","+id2);
                            output.println("131");
                        }else{
                            System.out.println("清空失败:"+id1+","+id2);
                            output.println("130");
                        }
                    };break;
                    case "20":{//获得好友列表
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=1){
                            System.out.println("参数不匹配。");
                            output.println("200");
                            break;
                        }
                        String id = para[0];
                        List<user> li_f = getFriend(id);
                        String str_f = "";
                        for(user u:li_f){
                            str_f = str_f + u.toString()+";";
                        }
                        output.println("201:"+str_f);
                        System.out.println("成功获取好友列表。");
                    };break;
                    case "21":{//添加好友
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数不匹配。");
                            output.println("210");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        //relation r = new relation((new Integer(id1).intValue()>new Integer(id2).intValue()?id2:id1),(new Integer(id1).intValue()>new Integer(id2).intValue()?id1:id2));
                        relation r = new relation(id1,id2);
                        addFailRelation(r);
                        System.out.println("add temp relation:"+r);
                        if(send(id2,"211:"+id1)){
                            System.out.println("发出添加好友通知。");
                        }else{
                            System.out.println("添加好友失败。");
                        }
                    };break;
                    case "22":{//删除好友
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数不匹配。");
                            output.println("220");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        if(new Integer(id1).intValue()>new Integer(id2).intValue()){
                            String temp = id1;
                            id1 = id2;
                            id2 = temp;
                        }
                        relation r = new relation(id1,id2);
                        if(deleteRelation(r)){
                            System.out.println("删除好友关系:"+id1+","+id2+" 成功。");    
                            if(send(id2,"221:"+id1)){
                                System.out.println("删除好友通知完成。");
                                output.println("221:"+id2);
                            }else{
                                System.out.println("删除好友通知失败。");
                            }
                        }else{
                            System.out.println("删除好友关系失败。");
                            output.println("220");
                        }
                    };break;
                    case "23":{//确认添加好友
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数不匹配。");
                            output.println("230");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        relation r = new relation(id1,id2);
                        if(addRelation(r)){
                            deleteFailRelation(r);
                            System.out.println("确认添加好友关系:"+id1+","+id2+" 成功。");    
                            if(send(id2,"231:"+id1+","+getUser(id1).getUsername())){
                                System.out.println("添加好友通知完成。");
                                output.println("231:"+id2+","+getUser(id2).getUsername());
                            }else{
                                System.out.println("添加好友通知失败。");
                                output.println("230");
                            }
                        }else{
                            System.out.println("确认添加好友关系失败。");
                            output.println("230");
                        }
                    };break;
                    case "24":{//拒绝好友请求
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数不匹配。");
                            output.println("240");
                            break;
                        }
                        String id1 = para[0];
                        String id2 = para[1];
                        relation r = new relation(id1,id2);
                        if(deleteFailRelation(r)){                        
                            if(send(id2,"241:"+id1)){
                                System.out.println("拒绝好友通知完成。");
                            }else{
                                System.out.println("拒绝好友通知失败。");
                                output.println("240");
                            }
                        }else{
                            System.out.println("拒绝添加好友失败。");
                            output.println("240");
                        }
                    };break;
                    case "30":{//更改用户名
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=3){
                            System.out.println("参数不匹配。");
                            output.println("300");
                            break;
                        }    
                        String id = para[0];
                        String name = para[1];
                        String pwd = para[2];
                        user u = new user(id,name,pwd);
                        if(verify(u)){
                            System.out.println("验证成功:"+u);
                            if(updateUser(u)){
                                System.out.println("用户信息更新成功。");
                                output.println("301:"+u.toString());
                            }else{
                                System.out.println("用户信息更新失败。");
                                output.println("300");
                            }
                        }else{
                            System.out.println("验证失败。");
                            output.println("300");
                        }
                    };break;
                    case "31":{//更改用户密码
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=3){
                            System.out.println("参数不匹配。");
                            output.println("310");
                            break;
                        }    
                        String id = para[0];
                        String name = para[1];
                        String pwd = para[2];
                        user u = new user(id,name,pwd);
                        if(verify(u)){
                            System.out.println("验证成功:"+u);
                            if(updatePwd(u)){
                                System.out.println("用户信息更新成功。");
                                u = getUser(id);
                                output.println("301:"+u.toString());
                            }else{
                                System.out.println("用户信息更新失败。");
                                output.println("300");
                            }
                        }else{
                            System.out.println("验证失败。");
                            output.println("300");
                        }
                    };break;
                    case "40":{//注册新用户
                        str = str.substring(3);
                        String[] para = str.split(",");
                        if(para.length!=2){
                            System.out.println("参数不匹配。");
                            output.println("400");
                            break;
                        }
                        String name = para[0];
                        String pwd = para[1];
                        user u = new user("*",name,pwd);
                        if(register(u)){
                            u = getUser(name,pwd);
                            System.out.println("用户注册成功。");
                            output.println("401:"+u.toString());
                        }else{
                            System.out.println("用户注册失败");
                            output.println("400");
                        }
                    };break;
                    case "55":output.println("echo	"+str.substring(2));break;
                    default:{
                        System.out.println("请求码匹配失败。");
                        output.println("-1");
                    };break;
                    }
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    }//synchronized
                }
            }catch(Exception e){
                try{
                    socket.close();
                    System.out.println("服务器出现异常。");
                    e.printStackTrace();
                }catch(Exception ee){}
            }
        }
        private void checkStatus(){//需要注意删除
            for(int i=0;i<li_socket.size();i++){
                System.out.println("检查第"+i+"个连接的状态。");
                if(!li_socket.get(i).isBound()){
                    li.remove(i);
                    li_socket.remove(i);
                    System.out.println("清除第"+i+"个连接。");
                    i--;
                }
            }
            System.out.println("状态扫描完成。");
        }
        private static Date convertToDate(String str){//用于将sql.date转化为util.date
            String[] li = str.split(" ");
            if(li.length!=2){
                System.out.println("converToDate 出错,空格错误");
                return new Date();
            }
            String[] para = li[0].split("-");
            String[] para1 = li[1].split(":");
            return new GregorianCalendar(new Integer(para[0]).intValue(),new Integer(para[1]).intValue(),new Integer(para[2]).intValue(),new Integer(para1[0]).intValue(),new Integer(para1[1]).intValue(),new Integer(para[2]).intValue()).getTime();        
        }
        private Boolean send(String id,String str){
            System.out.println("开始转发");
            Boolean flag = false;
            for(int i=0;i<li.size();i++)
            {
                if(id.equals(li.get(i).getId())){
                    Socket socket = li_socket.get(i);
                    PrintWriter output;
                    try {
                        output = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()),true);
                        output.println(str);
                        output.flush();
                        System.out.println("转发完成");
                        flag =true;
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        flag = false;
                        System.out.println("error in send"+i+","+str);
                    }                
                }
            }
            return flag;
        }
        private String receive(){
            String str ="";
            BufferedReader input =null;
            try{
                input =new BufferedReader( new InputStreamReader(socket.getInputStream()));//线程在这里等待输入流
                while(str.equals("")){
                    str = input.readLine();    
                }
            }catch(Exception e){
                System.out.println("socket 接收出错。");
            }finally{
                try {
                    input.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return str;
        }
        private List<user> getUserList(){    
            return new dao().getUserList();
        }
        private Boolean register(user u){
            user u_temp = new dao().getUser(u.getUsername(), u.getPwd());
            Boolean flag = false;
            if(u_temp==null){
                new dao().addUser(u);
                flag = true;
            }else{
                flag = false;
            }
            return flag;
        }
        private Boolean login(user u){    
            if(verify(u)){
                return true;
            }else{
                return false;
            }
        }
        private Boolean verify(user u){
            user du = getUser(u.getId());
            return du.getPwd().equals(u.getPwd());
        }    
        private user getUser(String id){    
            return new dao().getUser(id);
        }
        private user getUser(String name,String pwd){
            return new dao().getUser(name,pwd);
        }
        private Boolean deleteUser(String id){
            return new dao().deleteUser(id);
        }
        private Boolean updateUser(user u){        
            return new dao().updateUser(u);
        }
        private Boolean updatePwd(user u){
            return new dao().updatePwd(u);
        }
        private List<relation> getRelation(){    
            return new dao().getRelation();
        }
        private Boolean addRelation(relation r){        
            return new dao().addRelation(r);
        }
        private Boolean deleteRelation(relation r){        
            return new dao().deleteRelation(r);
        }
        private List<relation> getFailRelation(String id){
            return new dao().getFailRelation(id);
        }
        private Boolean addFailRelation(relation r){        
            return new dao().addFailRelation(r);
        }
        private Boolean deleteFailRelation(relation r){
            return new dao().deleteFailRelation(r);
        }
        private List<user> getFriend(String id){
            return new dao().getFriend(id);
        }
        private Boolean addmessage(message msg){
            return new dao().addmessage(msg);
        }
        private List<message> getfailmessage(String id){
            return new dao().getfailmessage(id);
        }
        private Boolean addfailmessage(message msg){
            return new dao().addfailmessage(msg);
        }
        private Boolean deletefailmessage(message msg){    
            return new dao().deletefailmessage(msg);
        }
        private List<message> getMessage(String id)//指定用户聊天记录
        {
            return new dao().getMessage(id);
        }
        private List<message> getMessage(String id1,String id2)//特定的两人的聊天记录
        {
            return new dao().getMessage(id1, id2);
        }
        private List<message> getMessage()//所有聊天记录
        {
            return new dao().getMessage();
        }
        private Boolean deleteMessage(String id1,String id2){
            return new dao().deleteMessage(id1, id2);
        }
        public void close()//关闭服务器;
        {
            try {
                server.close();
                System.out.println("服务器已关闭");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                System.out.println("服务器关闭出错。");
            }
        }
    }
    View Code

    服务器界面ServerView.java:

    package view;
    
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.ByteArrayOutputStream;
    import java.io.PrintStream;
    import java.util.List;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.border.EmptyBorder;
    
    import model.user;
    import control.Server;
    
    public class ServerView extends JFrame implements Runnable{
    
        private Server server;
        private JPanel contentPane;
        private JTextArea textArea;
        private JTextArea textArea_1;
        private ByteArrayOutputStream baos;
        private PrintStream old;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            try {
                ServerView frame = new ServerView();
                frame.setVisible(true);
                frame.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * Create the frame.
         */
        public ServerView() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            baos = new ByteArrayOutputStream();
            PrintStream ps = new PrintStream(baos);
            // IMPORTANT: Save the old System.out!
            old = System.out;
            // Tell Java to use your special stream
            System.setOut(ps);
            // Show what happened
            System.out.println("Here: " + baos.toString());
            
            setBounds(100, 100, 514, 305);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null);
            
            JButton btnNewButton = new JButton("关闭服务器");
            ServerView ser = this;
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            btnNewButton.setBounds(351, 232, 137, 23);
            contentPane.add(btnNewButton);
            
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(23, 20, 343, 202);
            contentPane.add(scrollPane);
            
            textArea = new JTextArea();
            scrollPane.setViewportView(textArea);
            
            JScrollPane scrollPane_1 = new JScrollPane();
            scrollPane_1.setBounds(376, 20, 112, 202);
            contentPane.add(scrollPane_1);
            
            textArea_1 = new JTextArea();
            scrollPane_1.setViewportView(textArea_1);
            
            JLabel lblNewLabel = new JLabel("服务器日志:");
            lblNewLabel.setBounds(23, 0, 103, 15);
            contentPane.add(lblNewLabel);
            
            JLabel lblNewLabel_1 = new JLabel("在线用户:");
            lblNewLabel_1.setBounds(376, 0, 112, 15);
            contentPane.add(lblNewLabel_1);
            
        }
        public void start(){
            new Thread(this).start();
            try{
                server = new Server(2002,4000);
                server.start();
            }catch(Exception ee){}
            finally{
                server.close();
                System.setOut(old);
                System.out.println("done");
            }
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            String str="";
            String str1="";
            while(true){
                System.out.flush();
                str = baos.toString();
                textArea.setText(str);
                str1="";
                if(server!=null){
                    List<user> li = server.getLi();
                    for(int i=0;i<li.size();i++){
                        user u= li.get(i);
                        str1 += u.getId()+" "+u.getUsername()+"
    ";
                    }    
                }
                textArea_1.setText(str1);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    System.out.println("error in  ServerView sleep(500)");
                }
            }
        }
    }
    View Code

     客户端代码Client.java:

    package control;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Scanner;
    import java.util.logging.Logger;
    
    import model.message;
    import model.relation;
    import model.user;
    public class Client implements Runnable{
            Socket socket;
            user client;
            List<user> li_friend = new LinkedList<user>();
            List<relation> li_relation = new LinkedList<relation>();
            List<message> li_offlineMsg = new LinkedList<message>();
            List<message> li_historyMsg = new LinkedList<message>();
            BufferedReader input ;
            PrintWriter output;
            Logger Log = Logger.getGlobal();
        public Client(){
            try{
                socket = new Socket("127.0.0.1", 2002);
                input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            }catch(Exception e){
                try{
                    input.close();
                    output.close();                
                    socket.close();
                }catch(Exception ee){}
                //System.out.println("创建客户端出现异常。");
            }
            //System.out.println("创建客户端……");
        }
        public void start(){
            new Thread(this).start();
            Scanner sc = new Scanner(System.in);
            String cmd="";
            while(true){
                //System.out.print(">>>");
                cmd = sc.nextLine();
                switch(cmd){
                    case "quit":System.exit(0);break;
                }
                send(cmd);
            }
        }
        private void send(String str){
            output.println(str);
            output.flush();
        }
        public void run(){//用于监听服务器
            String str = "";
            //System.out.println("开始监听服务器……");
            try{
                while(true){
                    Thread.sleep(1000);
                    str = input.readLine();
                    //System.out.println("接收到:"+str);
                    if(str.length()>0){
                        //System.out.print(">>>");
                    }
                    try{
                        String cmd = str.substring(0,3);
                        String old_str = str;
                        if(str.length()>4){
                            str = str.substring(4);    
                        }
                        switch(cmd){
                            case "001"://System.out.println("登录成功");
                            {
                                String[] li = str.split("&");
                                String[] u_str = li[0].split(";");
                                String[] para = u_str[0].split(",");
                                client = new user(para[0],para[1]);
                                for(int i=1;i<u_str.length;i++){
                                    para = u_str[i].split(",");
                                    if(para.length==2){
                                        li_friend.add(new user(para[0],para[1]));    
                                    }
                                }
                                if(li[1]!=null&&li[1].length()>1){
                                    li[1] = li[1].substring(1);
                                    String[] r_str = li[1].split(";");
                                    for(int i=0;i<r_str.length;i++){
                                        para = r_str[i].split(",");
                                        li_relation.add(new relation(para[0],para[1]));
                                    }
                                }
                                if(li[2]!=null&&li[2].length()>1){
                                    li[2]=li[2].substring(1);
                                    String[] m_str = li[2].split(";");
                                    for(int i = 0;i<m_str.length;i++){
                                        para = m_str[i].split(",");
                                        li_offlineMsg.add(new message(para[0],para[1],convertToDate(para[2]),para[3]));//convertToDate(str);
                                    }    
                                }                            
                                for(user u:li_friend){
                                    //System.out.println(u);
                                }
                                //System.out.println("001解析完成。");
                            }break;         
                            case "101"://System.out.println("查询与指定好友的历史消息成功");
                            {
                                String[] m_str = str.split(";");
                                for(int i=0;i<m_str.length;i++){
                                    String[] para = m_str[i].split(",");
                                    li_historyMsg.add(new message(para[0],para[1],convertToDate(para[2]),para[3]));
                                }
                            }break;
                            case "111"://System.out.println("点对点接收msg");
                            {
                                //System.out.println("111:"+str);
                                String para[] = str.split(",");
                                if(para.length==4){
                                    message msg = new message(para[0],para[1],convertToDate(para[2]),para[3]);
                                    li_offlineMsg.add(msg);    
                                    //System.out.println("消息链中加入消息:"+msg.toString());
                                }
                            }break;
                            case "121"://System.out.println("群发好友msg成功");
                            {
                                //System.out.println("121:"+str);
                                String para[] = str.split(",");
                                if(para.length==4){
                                    message msg = new message(para[0],para[1],convertToDate(para[2]),para[3]);
                                    li_offlineMsg.add(msg);    
                                    //System.out.println("消息链中加入消息:"+msg.toString());    
                                }
                            }break;
                            case "131"://System.out.println("删除历史消息成功");
                                break;
                            case "201"://System.out.println("获得好友列表成功");
                            {
                                String[] u_str = str.split(";");
                                for(int i=0;i<u_str.length;i++){
                                    String[] para = u_str[i].split(",");
                                    if(para.length==2){
                                        li_friend.add(new user(para[0],para[1]));    
                                    }
                                }
                            }break;
                            case "211"://System.out.println("添加好友成功");
                            {
                                String para[] =str.split(",");
                                if(para.length==1){
                                    li_relation.add(new relation(para[0],client.getId()));
                                    //System.out.println("收到"+para[0]+"的好友请求。");
                                }
                            }break;
                            case "221"://System.out.println("删除好友成功");
                                break;
                            case "231"://System.out.println("确认添加好友成功");
                            {
                                String para[] = str.split(",");
                                if(para.length==2){
                                    //li_friend.add(new user(para[0],para[1]));
                                }
                            }break;
                            case "241"://System.out.println("拒绝添加好友");
                            {
                                
                            }break;
                            case "301"://System.out.println("更新用户信息成功");
                                break;
                            case "401"://System.out.println("注册新用户成功");
                            {
                                String para[] = str.split(",");
                                if(para.length==3){
                                    client = new user(para[0],para[1],para[2]);
                                }
                            }break;
                            //失败
                            case "000"://System.out.println("登录失败");
                                break;
                            case "100"://System.out.println("查询与指定好友的历史消息失败");
                                break;
                            case "110"://System.out.println("点对点发msg失败");
                                break;
                            case "120"://System.out.println("群发好友msg失败");
                                break;
                            case "130"://System.out.println("删除历史消息失败");
                                break;
                            case "200"://System.out.println("获得好友列表失败");
                                break;
                            case "210"://System.out.println("添加好友失败");
                                break;
                            case "220"://System.out.println("删除好友失败");
                                break;
                            case "230"://System.out.println("确认添加好友失败");
                                break;
                            case "300"://System.out.println("更新用户信息失败");
                                break;
                            case "400"://System.out.println("注册新用户失败");
                            {
                                client = new user("-1","-1");
                            }break;
                            default: //System.out.print("遇到未识别的返回码:"+old_str);
                                break;
                        }
                    }catch(Exception e){
                        //System.out.println("解析服务器返回结果出错。");
                        e.printStackTrace();
                    }
                }            
            }catch(Exception e){}
        } 
        private static Date convertToDate(String str){//用于将sql.date转化为util.date
            String[] li = str.split(" ");
            if(li.length!=2){
                //System.out.println("converToDate 出错,空格错误");
                return new Date();
            }
            String[] para = li[0].split("-");
            String[] para1 = li[1].split(":");
            return new GregorianCalendar(new Integer(para[0]).intValue(),new Integer(para[1]).intValue(),new Integer(para[2]).intValue(),new Integer(para1[0]).intValue(),new Integer(para1[1]).intValue(),new Integer(para[2]).intValue()).getTime();        
        }
        public Boolean login(String id,String pwd){//00:登录   
            String str = "00:"+id+","+pwd;
            output.println(str);
            output.flush();
            return true;
        }
        public Boolean getMessage(String id)//10:查询与指定好友的历史消息
        {
            String str = "10:"+client.getId()+","+id;
            output.println(str);
            output.flush();
            return true;
        }
        public Boolean send(String id,String content)//11:点对点发msg
        {
            String str = "11:"+client.getId()+","+id+","+new Date().toLocaleString()+","+content;
            output.println(str);
            output.flush();
            return true;
        }
        public Boolean sendAll(String content)//12:群发好友msg
        {
            String str = "12:"+client.getId()+","+client.getId()+","+new Date().toLocaleString()+","+content;
            output.println(str);
            output.flush();
            return true;
        }
        public Boolean deleteMessage(String id)//13:删除历史消息
        {
            String str = "13:"+client.getId()+","+id;
            output.println(str);
            output.flush();
            return true;
        }
        public Boolean getFriend()//20:获得好友列表
        {
            li_friend=new LinkedList<user>();//获取好友列表列表申请发出后,好友列表清空。
            String str = "20:"+client.getId();
            output.println(str);
            output.flush();
            return true;
        }
        public Boolean addRelation(String id)//21:添加好友
        {
            String str = "21:"+client.getId()+","+id;
            output.println(str);
            output.flush();
            return true;        
        }
        public Boolean deleteRelation(String id)//22:删除好友
        {
            String str = "22:"+new relation(client.getId(),id).toString();
            output.println(str);
            return true;
        }
        public Boolean confirmRelation(String id)//23:确认添加好友
        {
            String str = "23:"+client.getId()+","+id;
            output.println(str);
            output.flush();
            for(relation r:li_relation){
                if(r.getId1().equals(id)||r.getId2().equals(id)){
                    li_relation.remove(r);
                }
            }
            return true;
        }
        public Boolean refuseRelation(String id)//24:拒绝好友请求
        {
            String str = "24:"+client.getId()+","+id;
            output.println(str);
            output.flush();
            for(relation r:li_relation){
                if(r.getId1().equals(id)||r.getId2().equals(id)){
                    li_relation.remove(r);
                }
            }
            return true;
        }
        public Boolean updateInfo(String name,String pwd)//30:更改用户名
        {
            String str = "30:"+new user(client.getId(),name,pwd).toString();
            output.println(str);
            return true;
        }
        public Boolean updatePwd(String newpwd,String oldpwd)//31:更改用户密码
        {
            String str = "30:"+new user(client.getId(),newpwd,oldpwd).toString();
            output.println(str);
            return true;
        }
        public Boolean register(String name,String pwd)//40:注册新用户
        {
            String str = "40:"+new user(name,pwd).toString();
            output.println(str);    
            return true;        
        }
    
        public List<user> getLi_friend() {
            return li_friend;
        }
        public void setLi_friend(List<user> li_friend) {
            this.li_friend = li_friend;
        }
        public List<relation> getLi_relation() {
            return li_relation;
        }
        public void setLi_relation(List<relation> li_relation) {
            this.li_relation = li_relation;
        }
        public List<message> getLi_offlineMsg() {
            return li_offlineMsg;
        }
        public void setLi_offlineMsg(List<message> li_offlineMsg) {
            this.li_offlineMsg = li_offlineMsg;
        }
        public List<message> getLi_historyMsg() {
            return li_historyMsg;
        }
        public void setLi_historyMsg(List<message> li_historyMsg) {
            this.li_historyMsg = li_historyMsg;
        }
        
        public user getClient() {
            return client;
        }
        public void logout(){
            client=null;
        }
        public void close(){
            try {
                PrintWriter p = new PrintWriter("off_msg.txt");
                for(message msg:li_offlineMsg){
                    p.println(msg.toString());
                }
                p.close();
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                //System.out.println("离线消息丢失");
            }
            try{
                input.close();
                output.close();                
                socket.close();
            }catch(Exception e){
                //System.out.println("客户端退出时出现异常。");
            }
            //System.out.println("客户端已退出。");        
        }
    }
    View Code

    登录界面loginview.java:

    package view;
    
    import java.awt.EventQueue;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    
    import control.Client;
    
    public class loginview extends JFrame implements Runnable {
        private Client client;
        private JTextField textField;
        private JPasswordField passwordField;
        private JLabel lblNewLabel_2;
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        loginview frame = new loginview(new Client());
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public loginview(Client client) {
            this.client = client;
            Toolkit tool = getToolkit();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            getContentPane().setLayout(null);
            
            JLabel lblNewLabel = new JLabel("用户名:");
            lblNewLabel.setBounds(79, 83, 81, 30);
            getContentPane().add(lblNewLabel);
            
            JLabel lblNewLabel_1 = new JLabel("密码:");
            lblNewLabel_1.setBounds(79, 127, 81, 30);
            getContentPane().add(lblNewLabel_1);
            
            textField = new JTextField();
            textField.setBounds(170, 88, 165, 21);
            getContentPane().add(textField);
            textField.setColumns(10);
            
            passwordField = new JPasswordField();
            passwordField.setBounds(170, 132, 165, 21);
            getContentPane().add(passwordField);
            
            JButton btnNewButton = new JButton("登录");
            loginview lv = this;
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    new Thread(lv).start();
                }
            });
            btnNewButton.setBounds(79, 188, 93, 23);
            getContentPane().add(btnNewButton);
            
            JButton btnNewButton_1 = new JButton("注册");
            btnNewButton_1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                    new registerview(client).setVisible(true);;
                }
            });
            btnNewButton_1.setBounds(182, 188, 93, 23);
            getContentPane().add(btnNewButton_1);
            
            JButton btnNewButton_2 = new JButton("取消");
            btnNewButton_2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            btnNewButton_2.setBounds(285, 188, 93, 23);
            getContentPane().add(btnNewButton_2);
            
            lblNewLabel_2 = new JLabel("");
            lblNewLabel_2.setBounds(122, 24, 256, 33);
            getContentPane().add(lblNewLabel_2);
            setResizable(false);
        }
        public String encryp(String pwd){
            byte[] message=null;
            message = pwd.getBytes();
            MessageDigest md=null;
            try {
                md = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            byte[] encrypwd =md.digest(message);
            BigInteger bigInteger = new BigInteger(1, encrypwd);
            return bigInteger.toString(16);
        }
        public void run(){
            char[] ch = passwordField.getPassword();
            String pwd = "";
            for(int i=0;i<ch.length;i++){
                pwd +=ch[i];
                ch[i]=' ';
            }
            client.login(textField.getText(),encryp(pwd));
            int time =0;
            lblNewLabel_2.setText("正在登录……");
            while(client.getClient()==null&&time<100){
                time++;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    //System.out.println("延时");
                }    
            }
            if(time==100){
                lblNewLabel_2.setText("登录超时,请使用正确的用户名与密码");
            }else{
                setVisible(false);
                ClientView clientview = new ClientView(client);
                clientview.setVisible(true);
                new Thread(clientview).start();
            }
        }
    }
    View Code

    注册界面registerview.java:

    package view;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    
    import model.user;
    import control.Client;
    
    public class registerview extends JDialog implements Runnable{
    
        private Client client;
        private final JPanel contentPanel = new JPanel();
        private JTextField textField;
        private JPasswordField passwordField;
        private JPasswordField passwordField_1;
        private JLabel lblNewLabel;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            try {
                registerview dialog = new registerview(new Client());
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * Create the dialog.
         */
        public registerview(Client client){
            this.client = client;
            setBounds(100, 100, 450, 300);
            getContentPane().setLayout(new BorderLayout());
            contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
            getContentPane().add(contentPanel, BorderLayout.CENTER);
            contentPanel.setLayout(null);
            
            JLabel label = new JLabel("u7528u6237u540DuFF1A");
    
            label.setBounds(118, 39, 73, 28);
            contentPanel.add(label);
            
            JLabel label_1 = new JLabel("u5BC6u7801uFF1A");
            label_1.setBounds(128, 77, 54, 26);
            contentPanel.add(label_1);
            
            JLabel label_2 = new JLabel("u91CDu65B0u8F93u5165u5BC6u7801uFF1A");
            label_2.setBounds(97, 113, 116, 31);
            contentPanel.add(label_2);
            
            textField = new JTextField();
            textField.setBounds(190, 39, 150, 28);
            contentPanel.add(textField);
            textField.setColumns(10);
            
            passwordField = new JPasswordField();
            passwordField.setBounds(190, 77, 150, 26);
            contentPanel.add(passwordField);
            
            passwordField_1 = new JPasswordField();
            passwordField_1.setBounds(191, 116, 150, 25);
            
            registerview review = this;
            
            contentPanel.add(passwordField_1);
            
            lblNewLabel = new JLabel("");
            lblNewLabel.setBounds(145, 174, 183, 28);
            contentPanel.add(lblNewLabel);
            {
                JPanel buttonPane = new JPanel();
                buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
                getContentPane().add(buttonPane, BorderLayout.SOUTH);
                {
                    JButton okButton = new JButton("OK");
                    okButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            char [] pwd = passwordField.getPassword();
                            char [] pwd1 = passwordField_1.getPassword();
                            Boolean flag = true;
                            if(pwd.length!=pwd1.length){
                                flag =false;
                            }
                            String str = "";
                            for(int i=0;flag&&i<pwd.length;i++){
                                if(pwd[i]!=pwd1[i]){
                                    flag =false;
                                }
                                str +=pwd[i];
                                pwd[i]=' ';
                                pwd1[i]=' ';
                            }
                            if(flag){
                                client.register(textField.getText(), encryp(str));
                                new Thread(review).start(); 
                            }else{
                                JOptionPane.showMessageDialog(null, "两次密码不一致", "请重新输入", JOptionPane.ERROR_MESSAGE);
                            }                    
                        }
                    });
                    okButton.setActionCommand("OK");
                    buttonPane.add(okButton);
                    getRootPane().setDefaultButton(okButton);
                }
                {
                    JButton cancelButton = new JButton("Cancel");
                    cancelButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            System.exit(0);
                        }
                    });
                    cancelButton.setActionCommand("Cancel");
                    buttonPane.add(cancelButton);
                }
            }
            setResizable(false);
        }
        public String encryp(String pwd){
            byte[] message=null;
            message = pwd.getBytes();
            MessageDigest md=null;
            try {
                md = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            byte[] encrypwd =md.digest(message);
            BigInteger bigInteger = new BigInteger(1, encrypwd);
            return bigInteger.toString(16);
        }
        public void run(){
            user u = client.getClient();
            lblNewLabel.setText("系统正在处理……");
            while(u==null){
                u=client.getClient();
                //System.out.println(u);
            }
            Icon icon =new ImageIcon("1.png");
            if(u.getUsername().equals("-1")){
                JOptionPane.showConfirmDialog(null, "该用户名已被占用"+":
    请重新输入用户名", "注册失败", JOptionPane.CLOSED_OPTION, JOptionPane.WARNING_MESSAGE,icon);
            }else{
                JOptionPane.showConfirmDialog(null, u.getUsername()+":
    你的账号是:"+u.getId(), "注册成功", JOptionPane.CLOSED_OPTION, JOptionPane.WARNING_MESSAGE,icon);
            }
            textField.setText("");
            passwordField.setText("");
            passwordField_1.setText("");
            client.logout();
            lblNewLabel.setText("系统处理成功");
        }
    }
    View Code

    客户端主界面ClientView.java:

    package view;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.HashSet;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Set;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JToolBar;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.border.EmptyBorder;
    
    import model.message;
    import model.user;
    import control.Client;
    
    public class ClientView extends JFrame implements Runnable{
    
        private Client client;
        private List<Chat> li_chat=new LinkedList<Chat>();
        private JPanel contentPane;
        private Object lock = new Object();
        private List<JPanel> li_panel_1=new LinkedList<JPanel>();
        private List<JButton> li_btnNewButton=new LinkedList<JButton>();
        private List<JLabel> li_JlblNewLabel_2=new LinkedList<JLabel>();
        private List<user> li_u=new LinkedList<user>();
        private JButton button_2;
        private JPanel panel;
        /*
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        ClientView frame = new ClientView(new Client());
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public ClientView(Client client) {
            this.client = client;
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 280, 450);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(new BorderLayout(0, 0));
            setContentPane(contentPane);
            //System.out.println(client.getClient());
            JLabel lblNewLabel = new JLabel(client.getClient().toString());
            contentPane.add(lblNewLabel, BorderLayout.NORTH);
            
            JToolBar toolBar = new JToolBar();
            contentPane.add(toolBar, BorderLayout.SOUTH);
            
            JButton button = new JButton("u7FA4u53D1u6D88u606F");
            button.addActionListener(new ActionListener() {//群发消息
                public void actionPerformed(ActionEvent e) {
                    new GChat(client).setVisible(true);
                }
            });
            toolBar.add(button);
            
            JButton button_1 = new JButton("u6DFBu52A0u597Du53CB");
            button_1.addActionListener(new ActionListener() {//添加好友
                public void actionPerformed(ActionEvent e) {
                    new addfriend(client).setVisible(true);
                }
            });
            toolBar.add(button_1);
            
            button_2 = new JButton("u597Du53CBu8BF7u6C42");
            button_2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {//处理好友请求
                    new ConformFriend(client).setVisible(true);
                }
            });
            toolBar.add(button_2);
            JScrollPane scrollPane = new JScrollPane();
            contentPane.add(scrollPane, BorderLayout.CENTER);
                 
            JLabel lblNewLabel_1 = new JLabel("好友列表:");
            scrollPane.setColumnHeaderView(lblNewLabel_1);
            
            panel = new JPanel();
            scrollPane.setViewportView(panel);
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
            
            li_u = client.getLi_friend();
            panel.setLayout(new GridLayout(li_u.size()+10, 1, 0, 0));
            for(int i=0;i<li_u.size();i++){
                li_chat.add(null);
            }
            for(int i=0;i<li_u.size();i++){
                user u= li_u.get(i);
                JPanel panel_1 = new JPanel();
                li_panel_1.add(panel_1);
                panel.add(panel_1);
                panel_1.setLayout(new BorderLayout(0, 0));
                JButton btnNewButton = new JButton("chat");
                li_btnNewButton.add(btnNewButton);
                btnNewButton.setName(""+i);
                btnNewButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        synchronized(lock){
                            JButton button = (JButton) e.getSource();
                            int num = new Integer(button.getName()).intValue();
                            Chat chat = li_chat.get(num);
                            if(true){
                                chat=new Chat(client,li_u.get(num));
                                li_chat.set(num, chat);
                                chat.setVisible(true);
                                chat.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                                li_btnNewButton.get(num).setBackground(new Color(100,100,100));    
                            }
                        }
                    }
                });
                
                panel_1.add(btnNewButton, BorderLayout.EAST);
                
                JLabel JlblNewLabel_2 = new JLabel(u.getId()+" "+u.getUsername());
                li_JlblNewLabel_2.add(JlblNewLabel_2);
                panel_1.add(JlblNewLabel_2, BorderLayout.CENTER);
            }        
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(true){
                List<user> li_curuser=new LinkedList<user>();
                client.getFriend();//先用一个新的好友链替代原有链,再等待接收数据
                while(li_curuser.size()==0){
                    li_curuser=client.getLi_friend();
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        //System.out.println("error in getli_friend");
                    }
                }
                //System.out.println();
                //System.out.print("li_u:");
                for(int i=0;i<li_u.size();i++){
                    //System.out.print(li_u.get(i)+";");
                }
                //System.out.println();
                //System.out.print("li_curuser:");
                for(int i=0;i<li_curuser.size();i++){
                    user user_cur = li_curuser.get(i);
                    Boolean flag =false;//包含为真,不包含为假
                    for(int j=0;j<li_u.size();j++){
                        if(li_u.get(j).getId().equals(user_cur.getId())){
                            flag=true;
                            break;
                        }
                    }
                    if(!flag){//不包含则添加
                        int index = li_u.size();
                        li_u.add(user_cur);
                        li_chat.add(null);
                        JPanel panel_1 = new JPanel();
                        li_panel_1.add(panel_1);
                        panel.add(panel_1);
                        panel_1.setLayout(new BorderLayout(0, 0));
                        JButton btnNewButton = new JButton("chat");
                        li_btnNewButton.add(btnNewButton);
                        btnNewButton.setName(""+index);
                        btnNewButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                synchronized(lock){
                                    JButton button = (JButton) e.getSource();
                                    int num = new Integer(button.getName()).intValue();
                                    Chat chat = li_chat.get(num);
                                    if(chat==null||true){
                                        chat=new Chat(client,li_u.get(num));
                                        li_chat.set(num,chat);
                                        chat.setVisible(true);
                                        chat.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                                        li_btnNewButton.get(num).setBackground(new Color(100,100,100));    
                                    }
                                }
                            }
                        });                    
                        panel_1.add(btnNewButton, BorderLayout.EAST);    
                        JLabel JlblNewLabel_2 = new JLabel(user_cur.getId()+" "+user_cur.getUsername());
                        li_JlblNewLabel_2.add(JlblNewLabel_2);
                        panel_1.add(JlblNewLabel_2, BorderLayout.CENTER);
                        //System.out.println("add"+i);
                    }
                }
                revalidate();
                repaint();
                for(int i=0;i<li_u.size();i++){
                    user user_cur = li_u.get(i);
                    Boolean flag =false;
                    for(int j=0;j<li_curuser.size();j++){
                        if(li_curuser.get(j).getId().equals(user_cur.getId())){
                            flag=true;
                            break;
                        }
                    }
                    if(!flag){
                        //System.out.println("remove"+i);
                        li_curuser.remove(i);
                        li_u.remove(i);
                        li_chat.remove(i);
                        li_panel_1.remove(i);
                        i--;
                    }
                }
                revalidate();
                repaint();
                List<message> li_m = client.getLi_offlineMsg();        
                Set<String> set_m = new HashSet<String>();
                for(message msg:li_m){
                    set_m.add(msg.getId1());
                }
                for(int i=0;i<li_u.size();i++){
                    if(set_m.contains(li_u.get(i).getId())){
                        li_btnNewButton.get(i).setBackground(new Color(255,100,100));    
                    }else{
                        li_btnNewButton.get(i).setBackground(new Color(0x6495ED));    
                    }
                    
                }
                if(client.getLi_relation().size()>0){
                    button_2.setEnabled(true);
                }else{
                    button_2.setEnabled(false);
                }
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    //System.out.println("error in run sleep(500)");
                }    
            }
    
        }
    
    }
    View Code

    好友聊天界面:Chat.java

    package view;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.List;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.border.EmptyBorder;
    
    import model.message;
    import model.user;
    import control.Client;
    import javax.swing.JScrollPane;
    
    public class Chat extends JFrame implements Runnable{
    
        private Client client;
        private user USER;
        private String msg="";
        private JTextArea textArea;
        private JTextArea textArea_1;
        private JPanel contentPane;
        private JScrollPane scrollPane;
        private JScrollPane scrollPane_1;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Chat frame = new Chat(new Client(),new user("120","Yozane"));
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public Chat(Client client,user u) {
            this.client = client;
            this.USER = u;
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null);
            
            scrollPane = new JScrollPane();
            scrollPane.setBounds(5, 197, 424, 59);
            contentPane.add(scrollPane);
            
            JPanel panel = new JPanel();
            scrollPane.setViewportView(panel);
            panel.setLayout(new BorderLayout(0, 0));
            
            textArea = new JTextArea();
            panel.add(textArea);
            
            JButton btnNewButton = new JButton("发送");
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if(!textArea.getText().equals("")){
                        client.send(USER.getId(),textArea.getText());
                        msg += client.getClient().getUsername()+":
      "+textArea.getText()+"
    ";
                        textArea.setText("");
                        textArea_1.setText(msg);    
                    }
                }
            });
            panel.add(btnNewButton, BorderLayout.EAST);
            
            scrollPane_1 = new JScrollPane();
            scrollPane_1.setBounds(5, 20, 424, 177);
            contentPane.add(scrollPane_1);
    
            textArea_1 = new JTextArea();
            scrollPane_1.setViewportView(textArea_1);
            textArea_1.setEditable(false);
            textArea_1.setBackground(new Color(0xB9D3EE));
            
            JLabel lblNewLabel = new JLabel(USER.getUsername());
            lblNewLabel.setBounds(5, 5, 424, 15);
            contentPane.add(lblNewLabel);
            Thread p = new Thread(this);
            p.start();
            this.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    p.stop();
                }
            });
            setResizable(false);
        }
        public String getMsg() {
            return msg;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(true){
                List<message> li = client.getLi_offlineMsg();
                for(message m:li){
                    if(m.getId1().equals(USER.getId())){
                        msg = msg+ USER.getUsername()+":"+m.getDate().toLocaleString()+"
      "+m.getContent()+"
    ";
                        textArea_1.setText(msg);
                        li.remove(m);
                    }
                }
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    View Code

    群发消息界面GChat.java

    package view;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.border.EmptyBorder;
    
    import model.user;
    import control.Client;
    
    public class GChat extends JFrame {
    
        private Client client;
        private JPanel contentPane;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        GChat frame = new GChat(new Client());
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public GChat(Client client) {
            this.client = client;
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(new BorderLayout(0, 0));
            
            JPanel panel = new JPanel();
            contentPane.add(panel, BorderLayout.SOUTH);
            panel.setLayout(new BorderLayout(0, 0));
            
            JTextArea textArea = new JTextArea();
            panel.add(textArea);
            
            JScrollPane scrollPane = new JScrollPane();
            contentPane.add(scrollPane, BorderLayout.CENTER);
            
            JTextArea textArea_1 = new JTextArea();
            scrollPane.setViewportView(textArea_1);
            
            JButton btnNewButton = new JButton("群发");
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String str = textArea_1.getText();
                    user USER = client.getClient();
                    client.sendAll(textArea.getText());
                    str += client.getClient().getUsername()+":
      "+textArea.getText()+"
    ";
                    textArea.setText("");
                    textArea_1.setText(str);                    
                }
            });
            panel.add(btnNewButton, BorderLayout.EAST);
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
    
    }
    View Code

    添加好友页面addfriend.java

    package view;
    
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.List;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    
    import model.user;
    import control.Client;
    
    public class addfriend extends JFrame {
    
        private Client client;
        private JPanel contentPane;
        private JTextField textField;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        addfriend frame = new addfriend(new Client());
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public addfriend(Client client) {
            this.client = client;
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 361, 221);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null);
            
            textField = new JTextField();
            textField.setBounds(87, 53, 145, 40);
            contentPane.add(textField);
            textField.setColumns(10);
            
            JLabel lblNewLabel_1 = new JLabel("");
            lblNewLabel_1.setBounds(87, 116, 254, 38);
            contentPane.add(lblNewLabel_1);
            
            JButton btnNewButton = new JButton("发送");
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String id = ""+textField.getText();
                    if(client.getClient().getId().equals(id)||id.equals("")){
                        if(id.equals("")){
                            lblNewLabel_1.setText("请输入对方账号");
                        }else{
                            lblNewLabel_1.setText("请不要输入自己的账号");
                            textField.setText("");    
                        }
                    }else{
                        List<user> li = client.getLi_friend();
                        Boolean flag =true;
                        for(user u:li){
                            if(u.getId().equals(id)){
                                flag =false;
                                break;
                            }
                        }
                        if(flag){
                            //System.out.println("addfriend("+id+")");
                            client.addRelation(id);
                            lblNewLabel_1.setText("已给"+id+"发送好友请求,等待对方确认");    
                            textField.setText("");
                        }else{
                            lblNewLabel_1.setText(id+"已经是你的好友了");
                            textField.setText("");
                        }    
                    }
                }
            });
            btnNewButton.setBounds(242, 53, 93, 40);
            contentPane.add(btnNewButton);
            
            JLabel lblNewLabel = new JLabel("对方账号:");
            lblNewLabel.setBounds(10, 52, 80, 40);
            contentPane.add(lblNewLabel);
            
    
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
    }
    View Code

    确认添加好友ConformFriend.java

    package view;
    
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.List;
    
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    
    import model.relation;
    import control.Client;
    
    public class ConformFriend extends JFrame {
    
        private Client client;
        private JPanel contentPane;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        ConformFriend frame = new ConformFriend(new Client());
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public ConformFriend(Client client) {
            this.client = client;
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 389, 208);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(new GridLayout(5, 1, 0, 0));
            List<relation> li = client.getLi_relation(); 
            for(int i=0;i<li.size();i++){
                relation r = li.get(i);
                JPanel panel_1 = new JPanel();
                contentPane.add(panel_1);
                panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
                
                JLabel lblNewLabel = new JLabel(r.getId1()+"		请求添加你为好友");
                panel_1.add(lblNewLabel);
                
                JButton btnNewButton = new JButton("同意");
                btnNewButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JButton button = (JButton) e.getSource();
                        if(r.getId1()==null){
                            button.setEnabled(false);
                        }else{
                            client.confirmRelation(r.getId1());
                            Icon icon = new ImageIcon("receive.jpg");
                            JOptionPane.showMessageDialog(null,"你已同意添加"+r.getId1()+"为好友","添加好友", JOptionPane.OK_OPTION,icon);
                            button.setText("已同意");
                            button.setEnabled(false);
                            r.setId1(null);
                        }
                    }
                });
                panel_1.add(btnNewButton);
                
                JButton btnNewButton_1 = new JButton("拒绝");
                btnNewButton_1.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JButton button = (JButton) e.getSource();
                        if(r.getId1()==null){
                            button.setEnabled(false);
                        }else{
                            client.refuseRelation(r.getId1());
                            Icon icon = new ImageIcon("refuse.jpg");
                            JOptionPane.showMessageDialog(null,"你拒绝了"+r.getId1()+"的好友申请","拒绝好友",JOptionPane.OK_OPTION,icon);    
                            button.setText("已拒绝");
                            button.setEnabled(false);
                            r.setId1(null);
                        }
                    }
                });
                panel_1.add(btnNewButton_1);
    
            }
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
    
    }
    View Code

    代码中核心部分在于Server.java、Client.java、ClientView.java.

    该项目代码存放在:https://github.com/OOMMYY/ICQ

  • 相关阅读:
    nginx配置
    线程与进程的区别:
    java面试题1
    递归的定义和优缺点
    使用jedis连接redis可能会出现的问题及解决方案
    Linux上安装Redis
    Linux 权限管理
    Maven
    网址备份
    反射
  • 原文地址:https://www.cnblogs.com/yuanzhenliu/p/5676721.html
Copyright © 2011-2022 走看看