基于 WebServices 简易网络聊天工具的设计与实现

添加链接描述

内容

本次课程实现一个类似 QQ 的网络聊天软件的功能;服务端采用
WebServices 提供技术支持,客户端采用 Windows 窗体,为用户提供网络聊
天的简单功能。

目的与要求

掌握完整项目开发的流程;
掌握 LINQ to SQL 类的使用;
掌握传递二进制文件的 Web 方法;
掌握 Web 服务中用户状态的管理;

四、 设计思路分析(包括需求分析、整体设计思路、概要设计)
需求分析:
1、聊天工具主要为用户服务,所以必须有好友管理模块,包含:添加好友、
删除好友(需要自己开发)等;并且还要有好友关系,我是你的好友不一定你
也是我的好友,好友关系具有单向性;
2、发送聊天信息;
3、发送文件,这里限制文件大小 10KB;
好友部分系统功能图:

群功能部分:
具体功能:
《web 服务》课程实验
3
1、用户注册:用户想要登陆系统必须先注册;
2、用户登陆:登陆成功后才能添加好友聊天;
3、添加好友:登陆成功后需要添加其他在线用户为好友,条件是:必须是在线
用户、不能已经是好友还要添加;
4、好友验证:当接收到添加好友的请求时,进行选择是否同意。同意则该好友
出现在自己的好友列表,拒绝则请求添加好友失败!
5、发送消息:登陆用户必须向自己的好友才能发送信息;
6、发送文件:登陆用户可以向好友发送小于 10KB 的文件,好友是否接收可以
选择;
应用程序架构:
采用 C/S 结构,服务端采用 WebServices 作为服务的技术支持,客户端采用
Windows Form 实现。
开发工具选择 Visual Studio 2010 旗舰版,数据库使用 SQL Server 2008;
服务端采用两层结构,即 DAL 和 BLL,数据访问层使用 LINQ to SQL 类来
实现,大大简化该层的设计工作量;业务逻辑层使用 LINQ 来操作数据对象;
五、 详细设计
1、数据库设计
(1)、数据库名称为 ws_message,包含下述五张表,Users 表为最基本表,
其他四张表的用户名字段全部是 User.Nickna 的外键。Group 表类似。
(2)User 表各字段定义
《web 服务》课程实验
4
(3)Friend 表各字段定义
(4)Group 表各字段定义
(5)GroupMembers 表定义,存储群中的好友。
(6)Messages 表定义
2、服务端结构分布
《web 服务》课程实验
5
(1) 数据访问层 Web.DAL
(2) 业务逻辑层 Web.BLL
提供数据库操作方法,业务逻辑层使用 LINQ 来操作数据对象。
(3) Web 服务
《web 服务》课程实验
6
3、客户端方法
《web 服务》课程实验
7
六、 系统测试
1、数据库的测试
2、服务端的测试
3、客户端测试(此时清空数据库中所有数据)
好友功能部分:
(1)用户登录窗体,标题显示登录界面 ICON
(2)用户注册界面
(3)类似注册 zxy 用户,添加其他两个账号,分别为 zhu、xiang
(4)首先登陆 zxy,按 Enter 键完成登陆
《web 服务》课程实验
8
(5)以用户“zxy”为例,登录后的主界面:
窗体介绍:
全部好友:显示当前用户的所有好友,包括在线和离线
在线好友:显示当前用户的在线好友
聊天 ing:第一个文本框显示聊天内容,下面一个文本框显示当前输入
所在群:列出当前用户所处的所有群
没选正群:显示选正当前用户所在群中的所有群成员。GroupBox 组件 Text 为选正
的群名称。
刷新按钮:刷新全部好友列表和在线好友列表,另外整个窗体所有列表,每个 4S
刷新一次。
删除好友按钮:删除删除全部好友列表中选正的好友。
《web 服务》课程实验
9
添加好友按钮:弹出一个会话窗口添加好友,详细见下述添加好友窗口。
加群按钮:弹出一个会话窗口,添加群,前提是知道要添加的群名称
发送文件按钮:支持好友之间传输不大于 10K 的文件
发送按钮:好友之间聊天和群聊天使用,支持 Enter 键发送
创建群按钮:弹出创建群窗体
解散群按钮:选正要解散的群,前提自己必须是群主,与之同时删除所有群成员
添加好友到群按钮:在全部好友中选择要添加的好友,在群列表中选正要添加到的
群,实现添加。
删除群成员:选正当前群列表中的要删除的群成员。
(6)接着用其他两个账号登陆,三个账号同时登陆截图
(7)添加好友窗体,按 Enter 发送添加好友请求到“zhu”用户
《web 服务》课程实验
10
(8)“zhu”用户收到添加好友请求,点击是表示同意添加,点击“否”表示拒绝,
注意:此处好友添加是单向添加。
(9)当“zhu”用户同意时,返回添加好友成功窗口,拒绝返回拒绝窗口。
(10)此时在“zxy”用户的聊天窗体中的“全部好友”和“在线好友”列表中都显
示了“zhu”这个用户
《web 服务》课程实验
11
(11)而在“zhu”用户的窗体中并没有同步添加“zxy”为好友,若想添加,重复
上述操作添加。进一步说明添加好友是单向的。
(12)删除好友操作以添加好友为例,同样只支持单向删除
(13)添加“zhu”、“xiang”为好友,但只有“zhu”在线。好友列表显示如下:
《web 服务》课程实验
12
(14)好友聊天功能,前提是在在线好友列表中选择好友,定向发送
(15)传送文件功能,选择好友,点击发送文件,弹出选择文件对话框,选择文件
发送
《web 服务》课程实验
13
(16)提示收到好友发来文件是否接收提示,选择接收,保存。
群功能部分:
(1)“zxy”用户创建群 zxyqun1
《web 服务》课程实验
14
(2)创建成功,兵选正刚创建的群,下面显示群中的成员,当前只有群主。
(3)点击添加好友到群,前提:选正全部好友中的一个好友和一个自己创建的群。
然后群成员列表变成两个用户。
(4)删除群成员:选正群成员列表中的“zhu”点击删除群成员,删除后只剩下“zxy”
用户。
(5)“zhu”用户完成加群请求操作,“zxyqun1”群主“zxy”收到加群请求,点击
同意完成添加。
《web 服务》课程实验
15
(6)“zxyqun1”中再次变成两个成员
(7)把用户“xiang”也添加到该群,实现群聊天功能
(8)解散群操作:自动删除群中所有的成员,然后删除该群,删除 zxyqun1,只能
群主才能解散。
《web 服务》课程实验
16
(9)点击“是”只剩下 zxyqun2 了:
七、 完成的规定实验部分
1、 不能直观查到在线用户,必须到后台数据库才能看到的局限性得到解决。
实现方法是添加两个好友列表,分为在线好友和全部好友。
2、 好友添加后就不能删除得到解决。
聊天窗体中删除好友按钮实现将全部好友列表中的选正的好友删除。
3、因为没有在线用户列表,则用户下线后也就看不到在线人数的减少得到解决。
在 User 表中添加 IsOnline 字段,bit 型,登录成功将 IsOnline 改为 TRUE,
当关闭聊天窗体时,在 application.exit();前面加一个 Offline();函数,将 IsOnline
字段改为 FALSE。
好友聊天的局限性得到近乎完美解决。
《web 服务》课程实验
17
八、 群功能添加方法说明
创建群:任何一个在线用户都能创建自己为群主的群。并将群主添加到群成员列
表 GroupMembers 中,IsPass 字段的值为 TRUE。
解散群:群主可以删除自己的群。其他成员不能删除自己所在的但不是群主的群。
解散群时,自动将 GroupMembers 中的所有群成员删除,再删除群。
添加群功能:群功能部分之前在线用户主动添加群,管理员添加全部好友中选正
好友入群,两种添加方法,其中第一种需要群管理员验证,而第二种不需要验证。
删除群成员功能:选正群成员列表中的好友,可以删除,不能删除自己,因为自
己是群主,删除了群就没了,若想删除自己,可以直接通过解散群来实现。
群聊天功能部分:实现在线好友聊天功能,不在线的好友,群消息保存在服务端,
当群成员上线时,在进行消息推送。
下载
|–|--|
| | |

摘 要 随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过服务器建立连接,来进行客户端客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统 关键词:局域网 聊天 socket java 聊天系统各功能模块 (1)服务器程序模块 服务器客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。 服务器线程源码: package qq.server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.*; import qq.dao.hibernate.IServiceDao; import qq.entity.*; public class ServerController { private User user; private Socket s; private IServiceDao dao; private ObjectInputStream ois; private ObjectOutputStream oos; private OnlineUser onlineUser; www.bylw120.com public ServerController(Socket s) { super(); dao=ServerMainClass.userDao; this.s = s; } public void handle() throws Exception { ois=new ObjectInputStream(s.getInputStream()); oos=new ObjectOutputStream(s.getOutputStream()); onlineUser=new OnlineUser(ois,oos); while(true){ Request req=(Request)ois.readObject(); ois.read(); RequestType type=req.getType(); if(type.equals(RequestType.exit)){ exitHandle(); break; }else if(type.equals(RequestType.login)){ loginHandle(req); }else if(type.equals(RequestType.register)){ registerHandle(); }else if(type.equals(RequestType.offline)){ offlineHandle(); break; }else if(type.equals(RequestType.changeInformation)){ changeInformationHandle(); }else if(type.equals(RequestType.modifypasswd)){ modifypasswdHandle(req); }else if(type.equals(RequestType.sendMessage)){ sendMessageHandle(req); }else if(type.equals(RequestType.receiveFile)){ receiveFileHandle(req); }else if(type.equals(RequestType.sendFile)){ sendFileHandle(req); } } } private void modifypasswdHandle(Request req) { Long id=Long.parseLong(req.getData("id")); String oldpwd=req.getData("oldpwd"); String newpwd=req.getData("newpwd"); Response res=new Response(RequestType.modifypasswd); try { dao.updatePwd(id, oldpwd, newpwd); res.setData(1); try { oos.writeObject(res); } catch (IOException e) { e.printStackTrace(); } } catch (RuntimeException e) { try { oos.writeObject(res); } catch (IOException e1) { e1.printStackTrace(); } } } private void changeInformationHandle() { try { User user=(User)ois.readObject(); Response res=new Response(RequestType.changeInformation); try { dao.updateUser(user); res.setData(1);//修改成功返回值带一个整形值 oos.writeObject(res); oos.flush(); } catch (RuntimeException e) { oos.writeObject(res);//失败则返回值不带参数 oos.flush(); e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private void exitHandle() { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } //发送文件 private void sendFileHandle(Request req) { // try { // User u=(User)ois.readObject(); // // } catch (Exception e) { // e.printStackTrace(); // } } //接受文件 private void receiveFileHandle(Request req) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值