仿qq聊天程序设计之借鉴
import java.net.DatagramPacket;
import java.io.Serializable;
import java.net.InetAddress;
public class QDatagramPacket implementsSerializable
{
//定义操作的类型,type用于传递时,识别操作类型
//各种操作定义为类属性,在网络环境下传递
privateint type;
publicDatagramPacket dPacket=null; //由于数据报包类不能被继承,所以定义一个数据报包类的引用
//publicstatic final int MESSAGESHOW_PIC_PERSONAL = 1;
// publicstatic final int MESSAGESHOW_PHOTO = 2;
publicstatic final int MESSAGESHOW_WORD_PERSONAL = 3; //私人聊天操作
publicstatic final int MESSAGESHOW_WORD_GROUP = 4; //群里聊天操作
// publicstatic final int MESSAGESHOW_PIC_GROUP = 5;
//publicstatic final int DATABASEHANDLE_FIND = 11;
//publicstatic final int DATABASEHANDLE_DEAL = 12;
//publicstatic final int DATABASEHANDLE_RESULT = 13;
//publicstatic final int DATABASEHANDLE_FLAG = 14;
publicstatic final int USER_INFO = 21; //用户信息操作
publicstatic final int USER_LOGIN = 22; //用户登录操作
publicstatic final int USER_REGISTER = 23; //用户注册操作
public static final int FIND_USER=31; //查找好友操作
publicstatic final int RETURN_USERINFO=32; //返回用户信息操作
publicstatic final int FIND_GROUP=33; //查找群号操作
publicstatic final int RETURN_GROUPINFO=34; //返回群消息操作
publicstatic final int JOIN_GROUP=35; //加入一个群
publicstatic final int RETURN_GROUPMEMBERS=36; //返回群组中成员信息
publicstatic final int MAKE_FRIENDS=37; //加好友操作
publicstatic final int SYSTEM_INFO = 91; //系统消息
publicstatic final int SYSTEM_ON_OR_OFFLINE = 92; // 判断是否在线
//两个构造函数
publicQDatagramPacket(byte[] b,int length)
{
dPacket=new DatagramPacket(b,b.length);
}
publicQDatagramPacket(byte[] b,int length,InetAddress add,int port)
{
dPacket=new DatagramPacket(b,b.length,add,port);
}
//获得操作类型
publicint getType()
{
return this.type;
}
//设置操作类型
publicvoid setType(int type)
{
this.type=type;
}
}
群聊,就是多人一起聊天。过程与私聊差不多。唯一的不同就是服务器会将信息转发给指定群的所有成员。
输入要查找的群ID号,客户端发送一个查询信息给服务器端,如果找到就返回用户服务信息。打开一个群信息显示界面,该界面会提供一个“加入此群”按钮,点击后可将此人加为好友。如果未找到,则弹出一个信息提示框。
聊天记录可以保存于客户端,在某一个客户端发送一个消息的时候可以先再临时文件中保存消息内容,再发送给服务器,再让服务器转发,临时文件可以定期更新。
图2-7删除好友活动图
聊天子系统的功能有:1)注册;2)登陆;3)添加群;4)查找群5)私聊;6)群聊;7)查看好友资料;8)查找好友;9)添加好友;10)创建好友分组。
用户表(QQUser):
属性:id,account(登陆账号),pwd,nickname,sign(个性签名),sex,email,head(头像)
关系:
一个用户可以有多个好友分组。
一个用户可以有多个群。
一个用户可以有多条留言。
好友分组表(Qqperson_group):
属性:id,userid(创建者ID),name(分组名)
关系:一条记录只对应一个用户,但是可以拥有多个组成员。
群表(Qqpublic_group):
属性:id,userid(创建者ID号),name(群名),sign(群公告)
关系:一个群只有一个创建者,但是可以拥有多个群成员。
图3-4系统各表之间的联系图
1 |
自动id号 |
Id |
整数 |
2 |
用户账号 |
Account |
整数 |
3 |
用户密码 |
Pwd |
字符 |
4 |
用户昵称 |
Nickname |
字符 |
5 |
用户签名 |
sign |
字符 |
6 |
用户性别 |
Sex |
字符 |
7 |
用户邮箱 |
|
字符 |
8 |
用户头像 |
Head |
字符 |
1 |
自动ID |
ID |
整数 |
2 |
发信人 |
Account_from |
整数 |
3 |
收信人 |
Account_to |
整数 |
4 |
发送内容 |
Content |
字符 |
1 |
自动ID |
ID |
整数 |
2 |
拥有者Id |
userid |
整数 |
3 |
分组名称 |
name |
字符 |
1 |
自动ID |
ID |
整数 |
2 |
创建人 |
userid |
整数 |
3 |
群名称 |
name |
整数 |
4 |
群的公共消息 |
sign |
字符 |
表3-5 用户与群的中间表(qquser_publicgroup)
1 |
自动ID |
ID |
整数 |
2 |
加入的群ID |
groupid |
整数 |
3 |
加入的用户的ID |
userid |
整数 |
表3-6 用户与分组的中间表(QQuser_persongroup)
1 |
自动ID |
ID |
整数 |
2 |
加入的分组的id |
groupid |
整数 |
3 |
加入分组的用户的id |
userid |
整数 |
userid number references qquser(id),
groupid number referencesqqpublic_group(id) ,
userid references qquser(id););
groupid number referencesqqpublic_group(id) ,
userid references qquser(id));
insert intoqquser values(1,1,'long','I'm long','male','helongyang@163.com','48.gif');
insert into qquser values(2,2,'a','aa','male','a@13.com','48.gif');
insert into qquser values(3,3,'b','bb','male','a@13.com','48.gif');
insert into qquser values(4,4,'c','cc','male','a@13.com','48.gif');
insert into qquser values(5,5,'d','dd','male','a@13.com','48.gif');
insert into qqperson_group values(1,1,'myfriend');
into qqpublic_group values(1,1,'ha ha','my new group');
insert into qqperson_group(1,1,1);
insert into qqperson_group(1,1,2);
insert into qqperson_group(1,1,3);
insert into qqperson_group(1,1,4);
insert into qqperson_group(1,1,5);
insert into qqpublic_group(1,1,1);
insert into qqpublic_group(1,1,2);
insert into qqpublic_group(1,1,3);
insert into qqpublic_group(1,1,5);
本界面要填写的项目包括:用户昵称,密码,邮件地址,个性签名。
该界面主要显示某个用户信息,包括用户的账号,昵称,性别,个性签名,用户等级等。
本界面还提供了一个“加为好友”按钮,如果点击它,此人将会被加为用户的好友。默认的是加到第一个好友列表,不过也可以移动其它好友分组。
本界面主要用来显示两个人的对话信息以及发送信息。发送的信息可以设置字体,大小,字体颜色。也可以发送一个QQ表情。
本界面主要用来显示多人的对话信息以及发送信息。发送的信息可以设置字体,大小,字体颜色。也可以发送一个QQ表情。右边显示的是群公告,可以用来公布一些必要的信息。
Number(账号)输入的必须是整型,它是一个用户登陆的账号。
Password(密码)可以是你设置好的字符串,字符串内容可以随便。
如果用户设置不正确,将会导致登陆不成功,系统会弹出相应的对话框。
Nickname(昵称),password(密码),sign(个性签名)可以是任意的字符串。
Email必须是Email地址格式,也就是中间必须含有“@”,否则提示输入不正确。
由于请求的服务不同,包的类型应该所区别。所以在设计的时候,应该在包中加一个存储包类型的属性并提供设置和获取这个属性的方法。以下就是对包抽象出来的应该有的方法,所有要传输的方法必须实现以下接口中的方法:
public interface DatagramPacket extends Serializable
// define class number for the packet which need to send to others
public static final int MESSAGESHOW_PIC_PERSONAL = 1;
public static final int MESSAGESHOW_PHOTO = 2;
public static final int MESSAGESHOW_WORD_PERSONAL = 3;
public static final int MESSAGESHOW_WORD_GROUP = 4;
public static final int MESSAGESHOW_PIC_GROUP = 5;
// define class number for the packet which not need to send to others
public static final int DATABASEHANDLE_FIND = 11;
public static final int DATABASEHANDLE_DEAL = 12;
public static final int DATABASEHANDLE_RESULT = 13;
public static final int DATABASEHANDLE_FLAG = 14;
public static final int USER_INFO = 21;
public static final int USER_LOGIN = 22;
public static final int USER_REGISTER = 23;
public static final int USER_REGISTERINFO = 24;
public static final int FIND_USER=31;
public static final int RETURN_USERINFO=32;
public static final int FIND_GROUP=33;
public static final int RETURN_GROUPINFO=34;
public static final int JOIN_GROUP=35;
public static final int RETURN_GROUPMEMBERS=36;
public static final int SYSTEM_INFO = 91;
public static final int SYSTEM_ON_OR_OFFLINE = 92;
// if (getTouerid()==0),then the datapacket will be sended to server
public String getTalkroomid();
服务器在接收包的时候,就调用它的getType()获得type的值,并采取相应的措施。
public voidinsertString(String s, SimpleAttributeSet attributset)
doc.insertString(doc.getLength(), s,attributset);
doc.insertString(doc.getLength(),"\n", null);
showScroll.getVerticalScrollBar().setValue(
showScroll.getVerticalScrollBar().getMaximum()+20);
showText.setCaretPosition(showText.getDocument().getLength());
6总结
用java开发GUI系统,比较麻烦的一点在于界面的设计。主要包括两个方面:组件不能随意设置背景图片、布局比较困难。目前有的工具(如netbeans,JBuilder)在这这布局方面可能比较好,但是手动更改代码非常不方便。关于背景的设置就更不好解决,设置颜色还可以办到,要想设置背景图片,那就得自己去重写某个类了。本系统重写的类有JPanel、DefaultTreeCender、DefaultMutableTreeNode等。其中JPanel重写了一个方法后可以设置背景图片,不过图片对象只能在构造器中传入。DefaultTreeCende和DefaultMutableTreeNode的重写是为了可以构建一个带有自定义图标的数组件。
对于文件传输模块,我本来想做成具备多文件下载和文件夹下载的功能的程序。但是有一点使我感到很困惑的是DataOutputStream对象一旦传输了byte数组,如果再传输字符串就会出现异常。为了避开这个问题,我以为把所有字符串转换成byte数组,然后再转换成字符串就可以解决问题。可出乎我的意料之外的是,这样解决会更加困难。这样做的困难是,假如有两个字节数组A和C,另外有一个字符串(假如这个字符串表示一个文件的开始,如“fileTransferStart”)转换成的字节数组B。当服务器把A、B、C三个数据依次发送出去后,客户端接收的B不再是B,它有可能与A混在一起,也有可能与C混在一起,也有可能A、B、C同时混在一起。当B代表着一个文件的结束与另一个文件的开始的时候,客户端程序就无法区分了,它会将多个文件的数据全部写入到一个文件。这样话的,这个文件就报废了。我对于这个问题的理解是,字符数组在网络传输的时候可能会进行重组,把多个非常短的数组合并成一个长度适中的数组,这样可能会节省资源开销吧。对于什么时候合并成一个数组我就不知道了。还有一种思路就是,把所有的字节数组类型的数据换成字符串,再通过字符串传输到客户端,客户端接收以后,首先判断这个是不是正常的字符串,如果不是就把它转换成byte数组写入到文件中。因为时间的关系没来得及验证这种想法。就算这种想法可以,它也会在效率上大大折扣的,毕竟把byte数组转换成字符串和把字符串转换成字节数组是需要时间的。
[1] 王昆,张力生.Java Swing中的渲染器机制.重庆工学学院报,2008,22(10):175~178.
[2] 吕校春,李玲莉.基于Swing的Java GUI组件开发[J].机械工程师,2008(5):129~131.
[3] 陆维厅,邵燕.基于JAVA的SOCKET实现网上交谈.河海常州分校学报,2005,3(14):31~35.
[4] 戴歆.JAVA Swing程序开发.软件导刊,2007,2(6):22~29.
[5] 莫足琴.基于Java Socket多客户端并发通信聊天程序的设计与实现.十堰职业技术学博士论文,2008:253~255.
[6] 王静,曲凤娟.基于Socket的多用户并发通信的设计[J].福建电脑,2007(3):164.
[7] 赵文清,姜波.基于Socket的Java语言网络通讯机制和程序设计.信息技术,2006,8(7):66~67.
[8] 温涛.工程概念.软件工程师,2006(1):16~18
[10] 朗波.JAVA语言程序设计.清华大学出版社,2005:189~190.
[11] 曹健.计算机软件发展.IT时代周刊,2005(2):12~15
[12] 周燕飞,左敦稳,李亮.数据库原理与应用.北京:机械工业出版社,2003:78~89
[13] 张景中.应用计算机.计算机应用,2008(1):23~28
[14] Ian Somerville. Software engineering.北京:机械工业出版社,2004:73~84.
[15] Paul C.Jorgensen. 软件测试.西安:机械工业出版社,2003:134~139
[16] 赵池龙,姜义平,张建. 软件工程实践教程. 北京:电子工业出版社,2006:160~185.
[17] 萨世煊,王珊. 数据库系统概论(第三版). 北京:高等教育出版社,2006,23-100.
仿qq聊天程序设计之借鉴相关推荐
- 仿QQ聊天程序(java)
仿QQ聊天程序(java) 2014年03月17日 15:52:47 标签: java / 聊天 / 仿QQ 90246 仿QQ聊天程序 转载出处: https://blog.csdn.net/u01 ...
- 转载:仿QQ聊天软件2.0版
仿QQ聊天软件2.0版 这是大神的地址:牟尼的专栏 http://blog.csdn.net/u012027907 详细的过程本人没看,但是看见他的实现效果,相当诱人! 上次课设做了Java版 ...
- Android源码解析--SwipeMenuListView仿QQ聊天左滑
版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/lyhhj/article/details/50612714 绪论: 好久没写博客了,最近比较懒,不想写博客 ...
- Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命
Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...
- 网络编程-基于MFC的仿QQ聊天室-2020
基于MFC的仿QQ聊天室(2020) 有幸学习过网络编程的一些知识,出于对编程的热爱,把曾经的一次简单实践编程作业进行了自定义的完成. 编程所需: 编程工具为VS 2010,需要掌握MFC的基本操作以 ...
- 仿QQ聊天软件(登录界面、好友界面、聊天界面)-Java(Swing、Socket)
文章目录 一.项目结构 二.项目功能 三.制作界面 (一).登录界面的制作 (二).好友列表界面 (三).聊天界面 四.制作服务器 五.设计通信协议 六.项目缺点 学习了socket通信后,就想来制作 ...
- 仿QQ聊天软件(JavaFX+云端数据库)
仿QQ聊天软件(JavaFX+云端数据库) 这个项目是这学期(大二上学期学完Java后的期末项目),寒假闲着无聊就整理下发上来供大家学习以及参考啦(因为国内关于JavaFX的各种资料感觉都太浅了,本来 ...
- 悄悄说--一个Swing界面的仿qq聊天软件
1.项目简介 一个仿QQ聊天的软件,实现了用户注册,登录,私聊,创建群组进行多人聊天 2.功能描述 用户进行注册自己的用户名,密码,以及个人简介,然后进行登录 当用户注册成功时,会弹出一个注册成功提示 ...
- java qq通信,Java通信-仿QQ聊天项目
前后历时一个多月的Java实现聊天通信项目-仿QQ聊天室基本告一段落,期间面对了很多问题,也有不同的解决方案,重写了几次核心代码,等等问题.现在在项目的结束之时,给自己做一个总结,算是一个回顾,算是一 ...
最新文章
- 2021年全网最详细大数据常见端口汇总❤️【建议收藏】❤️
- Go在windows10 64位上安装过程
- 【ACM】杭电OJ 2027
- 电脑图片不显示缩略图怎么办
- php+yii手册下载,yii中文手册-yii框架中文手册教程下载pdf格式免费版-东坡下载
- windows-oracle下载安装,简单的启动使用。
- 第16课 开灯关灯 《小学生C++趣味编程》
- 当你的程序在朋友的机器上显示丢失msvcr100d.dll的时候
- [存档]获取通讯录信息并写到SD卡上
- 12. GD32F103C8T6入门教程-定时器-3路pwm输出
- Java 杨辉三角的简单实现
- linux内存不足,swap交换分区创建
- 关于指针初始化的问题 - 回复下雨天2
- python 公众号开发框架_基于werobot框架的微信公众号开发
- vue下拉框数据填充
- 如何制作一本《现代Javascript教程》电子书离线学习使用
- 数据分析学习之roc曲线
- 控件布局通用解决方案
- ECharts加载省份地图
- 大数据之flink数据一致性
热门文章
- 小案例:实现http://www.alloyteam.com/page/0/移动端效果,博客文章列表和文章详情页面
- matlab菜鸡学习日志--------使用matlab解析NMEA-0183 协议获取经纬度以及航向角
- linux重启和关闭系统命令
- 优秀的web前端工程师需要哪些软技能
- 如何用 Python 爬取网易云音乐歌单
- 如何往hive直接插入自定义数据values
- 复制360doc个人图书馆文章经验分享贴(仅供学习)
- C++ 实时显示7z压缩与解压缩的进度
- Qt5.9.0下载与安装(windows版本)
- egg.js入门教程视频文件(转载于cnode社区)