基于java技术的即时聊天系统实现内容摘要:

seAdapter() { public void mouseClicked(MouseEvent e){ if(()==1){ JLabel facelabel = (JLabel)(())。 (())。 } 9 } })。 (jl[i])。 } 图 5 5 聊天窗口界面 服务器端界面 服务端仅是用来开启 Socket,界面并没有什么太多的功能,只是两个按钮而已,在这里就不做过多的介绍了。 功能实现 在实现功能之前我们需要做一些必要的 共同 类。 首先我们需要做一个 用户信息类( User),接着是信息类( Message),其次是消息类型类( MessageType),它们不需要做过多的设计,只需要定义一些需要的变量,然后对其进行 Set 和 Get 即可。 实现登录 实现登录功能还是一个比较简 单的功能,只需要我们获取到用户的登录帐号和登录密码,通过对象流 将对象 ( u) 给 传递给 服务器,服务器 通过 Get 方法获取帐号和密码,然后从数据库中查询 用户的密码 字段 信息 进行对比,将对比的后的信息再通过对象流的方式传递给客户端,再进行相应的处理。 代码如下: User M=new User()。 (().Trim())。 ((new String(())))。 ()。 QqClientUser qqClientUser=new QqClientUser()。 if((M)){ QqFriendListFrame PeopleList =new QqFriendListFrame(M. getUserNo ())。 //将 好友 聊天窗口添加到 集合中 ((), PeopleList)。 ObjectOutputStream oos = null。 try { 10 oos=newObjectOutputStream( ().getS().getOutputStream())。 } catch (IOException e1) { ()。 } Msges S=new Msges ()。 //做一个 Message ()。 (())。 //指明我要的是这个 帐号 的 全部 好友 } 实现注册 注册功能需要将用户在注册界面的填写信息和相应的选择信息,通过对象流的形式将对象( u)传递给服务器,服务器调用数据库插入代码即可。 代码如下: MessageArray R=new MessageArray()。 String []Str=new String[6]。 MD5 getMD5 = new MD5()。 Str[0]=()。 Str[1]=()。 Str[2]=((()))。 Str[3]=SEX。 Str[4]=().toString()+().toString()+edItem().toString()。 Str[5]=().toString()+ +().toString()+().toString()。 (Str)。 User M=new User()。 (Str)。 ()。 ClientUser qqClientUser=new ClientUser()。 if((M)){ dispose()。 new ClientLogin()。 } 实现修改密码 密码的修改相对的简单,用户只需要根据相应的 选项卡 填写,就能够进行密码的修改,至于实现的代码如下: User M=new User()。 (m[0])。 (1)。 ((m[1]))。 ((m[2]))。 ()。 ClientUser qqClientUser=new ClientUser()。 if((M)){ dispose()。 new ClientLogin()。 } 11 添加、删除好友 添加好友相对于删除好友,是一件比较麻烦的事情,具体的思路是:当用户在添加好友输入框中输入想要添加好友的帐号,然后通过对象流将对象( m)传送给服务器,服务器通过后台 HashMap 集合 获取好友的线程,然后将对象传递给好友。 对于如何获取到好友的线程呢。 在这里就粗略的讲述一下:本系统在每个 用户登录的时候,服务器都会为每个用户新建一个线程,同时将每个用户的线程和其帐号通过 HashMap 进行键值对的绑定, 到使用的时候服务器只需通过帐号就能获取到相应的帐号线程 ,这样就能够很简单的帮我们想要传递的信息转发给相应的好友。 代码如下: public HashMap Thread=new HashMapString, ServerConnecClient()。 //向 hm 中添加一个客户端通讯线程 public static void SetClients (String No, ServerConnecClient Sct){ (No, Sct)。 } public static ServerConnectClient getClient(String No){ return (No)。 } 图 5 6 添加、删除好友选项框 图 5 7 添加好友提示框 移动黑名单 黑名单功能是每个即时聊天软件必不可少的功能,对于本系统的黑名单功能,那么我又是如何实现 的呢。 其实在方法是比较简单的, JTree 提供一个自带的方法,它允许子节点进行移动,我们能够在界面上看到相互之间的移动,那么剩下的问题就是数据库存储的问题了。 对于通常系统的黑名单,你将对方添加至黑名单,但对方并未将你删除 或者也添加至黑名单;而且本系统的数据库中的好友字段在添加好友的时候只是将要添加好友的帐号追加到自己的好友字段中,好友的字段不做任何 的处理, 所以在添加黑名单的时候,你不知道自己的好友字段中是否有此帐号; 本着简单的原则,我们只要将你想添加黑名单的帐号追加到你的黑名单字段,对于其在你好友字段中不做任 何的处理。 只需要在提取好友 ID 信息的时候把存在黑名单中的好友 ID 移出即可。 代码如下: public ArrayList getfriend(String userId){ String sql1=select friendId from friend where zhanghao=+userId+ limit 1。 String sql2=select zhanghao from friend where friendId like 39。 %+userId++%39。 String sql3=select blackname from friend where zhanghao=+userId+ limit 1。 SqlHelper sqlhelp=new SqlHelper()。 ArrayList str=(sql1, sql2,sql3)。 ArrayList al=new ArrayList()。 Object[]tr1=(Object[])(0)。 Object[]tr2=(Object[])(1)。 12 for(int i=0。 i。 i++){ //(tr1[i])。 (tr1[i])。 FOR(Int j=0。 j。 j++){ //(tr2[i])。 if(tr1[i].equals(tr2[j])){ (tr1[i])。 } } } Object[]tr=()。 ()。 (Str)。 (str2)。 return al。 } 多对多聊天 多对多的聊天是本系统的一个比较亮点的设计,用户能够在同一时间跟多个用户进行聊天,对于聊天的内容不会错乱。 同绑定线程一样,在用户开启好友聊天界面的时候,客户端将你的帐号同聊天好友的帐号组合在一起,通过 HashMap 的键值对的形式将组合后的字符串和这个窗口进行绑定,每开启一个窗口都进行绑定,等到客户端接受到服务器发送来的信息,进行相应的处理,即可将信息追加到对应的聊天窗口中。 代码如下: Msges S=new Msges ()。 if( Msges ().equals( 3)){ if((()+ +())==null){ QqFriendChatFrame FriendChat=new QqFriendChatFrame((),())。 (()+ +(), qqChat)。 } QqFriendChatFrame FriendChat=(()++ ())。 if(!()){ (true)。 } ((), (), (), (), (), (), ())。 //显示 } 显示表情 在本聊天系统中,用户能够发送表情图片,然而图片跟文字是不一样的,不能够直接的显示在聊天窗口上的, 也不能直接的传送给好友, 也不能将其直接的存放在数据库中;因此,我专门给显示表情编写了一些必要的函数。 由于本系统是 C/S 架构的,每一个客户端都是一样的,系统内存放着这些表情图片,而且每一个表情图片都有自己相应的 Id;因此,我们只需要提取到使用的表情图片的 Id,以及获得它在发送信息的位置即可,到时我们只需要将发送的文本和表情的 Id 及其在发送信息的位置发送过去即可,客户端内置一些专 门处理表情的函数,代码如下: 13 重组发送表情 : private String buildPicInfo(){ StringBuilder all = new StringBuilder()。 for(int i = 0。 i ().length()。 i++){ if(().equals(icon)){ Icon icon = (().getAttributes())。 FriendChatIcon Fch = (FriendChatIcon)icons。 PictureInfo pictureInfo= new PictureInfo (i,(()))。 (pictureInfo)。 (i++ ()++)。 } } } 重组收到的表情信息串 : public void receivedPicInfo(String pic){ String[] PicInfo = ([+])。 FOR(Int i = 0。 i。 i++){ String[] pp = PicInfo [i].split([])。 if(==2){ PicInfo Spic = new PicInfo((pp [0]), pp [1])。 (Spic)。 //将表情添加到滚动列表中 } } } 图 58 表情窗口 文件的发送 发送文件是很多聊天系统都拥有的功能,在本系统中我们能够发送文本文件、音乐、视频等 ,能够给用户提供更多的服务。 对于如何发送文件,这是个值得探讨的问题。 在 Java中,它提供了很多能够发送文件的方法,例如字符流、字节流、对象流等,但是在服务器端、客户端我们一直使用的是对象流进行数据的接受、发送,从而使发送的信息不至于错乱。 考虑到我们不可能专门为发送文 件再写一个服务器端,因此,对于文件的发送我们再次的使用对象流的形式进行发送,同样文件的发送也可以多对多的发送,不会造成错乱。 文件 的发送方式 已经解决,那么对于文件的读取方式我们需要再次进行思考, 由于发送的文件除了有文本文件,还有音乐、视频等,我们不可能直接使 用字符流的方式进行读取,因此,我们只能 14 采用字节流的形式读取文件。 此时,文件的读取方式、发送方式已经确定,剩下的 就是写入方式了,既然我们采用的是字节流的方式读取的,就应该用字节流的方式进行写入,如何采用字符流的方式写入,会出现一些意想不到的问题,例如:文本文 件可能会有乱码,一些图片、 exe 文件等打不开的问题。 代码如下: 文件的读取和发送: FileInputStream fis =new FileInputStream(filePath)。 byte []bytes=new byte[1024*4]。 while(((bytes))!=1){ (bytes)。 ObjectOutputStream pos=new ObjectOutputStream(getOutputStream())。 (sm)。 } 文件的写入: FileOutputStream ps=new FileOutputStream(()+\\+(),true)。 (())。 历史记录 历史记录是每一个即时聊天系统必备的功能,本系统的历史记录做的相对比较简单,除了能够 在每一页 显示 规定的 记录 条数之外 ,还能够显示当前页数和总页数,用户能够通过点击上一页和下一页进行翻看历史记录。 代码如下: public void AppendReceiveChatRecord(ArrayList List){ //接受到的聊天历史信息追加 ()。 For(Int i=0。 i ()。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。