基于Socket的聊天室管理系统Word格式.docx
- 文档编号:20859336
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:12
- 大小:141.05KB
基于Socket的聊天室管理系统Word格式.docx
《基于Socket的聊天室管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《基于Socket的聊天室管理系统Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
(2)较熟练地编写C#语言应用程序。
(3)了解C#语言的常用类、网络编程技巧、异常处理。
(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。
(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。
(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。
课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。
正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
2010年7月12日
第1章课程设计的目的与要求
1.1课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《C#网络程序开发案例》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:
1.巩固和加深学生对C#语言课程的基本知识的理解和掌握
2.掌握C#语言编程和程序调试的基本技能
3.利用C#语言进行基本的网络软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C#语言解决实际问题的能力
1.2课程设计的实验环境
硬件要求能运行Windows2000/XP操作系统的微机系统。
C#语言程序设计及相应的开发环境。
1.3课程设计的预备知识
熟悉C#语言及.NET开发工具。
1.4课程设计要求
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
第2章课程设计内容
2.1系统功能
聊天交流是目前互联网提供的主要内容。
聊天系统有多种实现方式,类似ICQ属于一种点对点的聊天系统;
还有一种是基于Socket的集中式聊天系统,这种聊天系统需要登陆统一的聊天服务器。
在基于Socket的聊天系统中,主要有两种角色:
服务器和客户端,不同的客户端登陆集中式的服务器,通过服务器将一个客户端发出的信息推送到其他所有客户端。
基于Socket的聊天系统最早实现是使用网页刷新方式,通过客户端不断地自动刷新,将服务器端整个页面内容下载到客户端显示,这种方式的聊天速度慢,而且有刷屏现象,很快被更新的聊天技术所替代。
聊天系统在客户端和服务器之间主要传送的是文字信息,服务器端只需要把最近的文字信息推送到客户端,这样减少了网络传输内容,节省了网络传输的时间,无疑提高了聊天速度。
这种“推”技术是目前基于Socket聊天系统的主要实现技术。
在基于Socket的聊天系统,客户端和服务器必须保持随时随地的连接。
这有别于普通Web浏览的连接方式。
在使用浏览器访问服务器时,先由客户端发出HTTP协议,然后服务器响应处理这个客户端的响应,再返回处理结果;
请求(Request)和响应(Response)是一种一对一的前后因果关系。
而在基于Socket的聊天系统中,客户端发出聊天信息的同时,客户端也在接受服务器发送过来的其他人的聊天信息,因此,请求和响应不存在那种前后对应关系,是两种分别独立进行的进程。
因为服务器任何时候都可能发送信息到客户端,因此,客户端和服务器一旦建立连接,必须能让服务器在以后发送中寻找定位到这个连接。
P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。
这样一来,P2P也就可以理解为“伙伴对伙伴”的意思,或称为对等联网。
目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。
系统是局域网聊天工具,设计能实现局域网内聊天服务端与客户端的功能。
主要实现如下功能:
聊天服务端:
实现与客户端的连接,接收来自客户端的聊天消息,并且根据客户端的要求把这些信息转发到另外一个或多个聊天客户中。
并实现对客户端登录用户的管理与控制;
实现客户端聊天信息的监控与保存。
聊天客户端:
实现与服务端的连接,建立和维护与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接受对方的响应。
实现与其他用户的文本的发送,并实现聊天的功能。
“服务器地址”文本框:
用于输入聊天室服务器的IP地址或者是聊天室服务器的机器名字。
“端口号”文本框:
聊天室服务器进行听的端口号。
“用户名”文本框:
登录聊天室服务器的用户名,如果为空,单击“登入”按钮时会提示用户输入用户名。
“登入”按钮:
单击该按钮会连接到聊天室服务器。
“离开”按钮:
单击该按钮会退出聊天室服务器。
消息内容文本框:
窗口最右下角的文本框用于输入聊天内容,单击发送这些消息。
“发送”按钮:
用于发送聊天信息。
2.2系统设计
开启服务器,文本聊天窗体加载成功后,将启动监听线程,服务器主要是负责监听局域网内的用户的连接请求。
收到客户发起的连接请求后,若服务器处于空闲状态,弹出消息提示框,对请求进行处理,服务器可以选择接受或者拒绝客户端的连接。
若同意连接,则返回给客户端同意信号,开启服务器的接收信息线程,并置消息发送事件为Enable。
客户端收到服务器返回的同意信号后,也开启接收信息线程,并置消息发送事件为Enable。
通信双方就可以进行文字聊天了。
若服务器端拒绝客户端的连接,则关闭tcpconnect,并关闭网络流,继续执行监听。
客户端得知服务器端关闭tcpconnect并关闭网络流之后,则释放本次socket和网络流。
若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的接入。
文本聊天服务器工作流程如图2.1所示:
图2.1流程图
只有充分地了解了聊天程序的工作流程,才能对整个系统的理解更加深刻。
所以对该流程进行分析如图2.2—2.3所示:
图2.2系统流程分析图
图2.3系统功能图
2.3系统实现
1、定义相关变量。
2、集成主窗体创建后,创建一个tcpListener的对象,端口为5000,IP为任意。
创建监听线程wait,wait线程执行的是waitconn()方法,启动监听线程。
调用getMyIP()方法用于获取本地IP地址,并在连接建立时传给对方。
当wait线程监听到远程用户的接入连接请求,弹出消息提示框,用户可以选择同意或拒绝接入请求。
若同意,则创建接收信息线程th,并启动th。
若用户拒绝远程接入请求,则关闭网络流nss,关闭tcps,并调用disconnect()重新初始化相关变量。
3、接收信息时,尝试读取网络流,采用的是Unicode编码。
读取到的消息如果不为断开连接信号,则在聊天记录框里面显示出来;
若为断开信号,则执行disconnect()方法关闭当前连接。
4、当无接入请求,则判断用户是否有尝试连接远程服务端事件。
若有,创建TcpClient的对象tcpc,并尝试连接远程主机。
5、连接建立后,用户单击“发送消息”按钮或者在输入文本框内按热键“Alt+S”或“Ctrl+Enter”,触发send_Click事件。
send_Click事件主要是将用户的输入通过Socket,采用网络流的形式传输给远程用户,编码采用Unicode,同时在聊天记录框里面显示出来。
6、断开连接或关闭窗体,需要将Socket、网络流以及接收信息线程th进行关闭,重置各按钮的可用状态。
若是关闭窗体,还需将wait线程关闭。
代码如下:
#pragma
once
#include
<
list>
//
定义iMessageType的值
#define
LOGIN
1
LOGOUT
2
P2PTRANS
3
GETALLUSER
4
服务器端口
SERVER_PORT
2280
Client登录时向服务器发送的消息
struct
stLoginMessage
{
char
userName[10];
password[10];
};
Client注销时发送的消息
stLogoutMessage
Client向服务器请求另外一个Client(userName)向自己方向发送UDP打洞消息
stP2PTranslate
Client向服务器发送的消息格式
stMessage
int
iMessageType;
union
_message
stLoginMessage
loginmember;
stLogoutMessage
logoutmember;
stP2PTranslate
translatemessage;
}message;
客户节点信息
stUserListNode
unsigned
ip;
short
port;
Server向Client发送的消息
stServerToClient
stUserListNode
user;
//======================================
下面的协议用于客户端之间的通信
P2PMESSAGE
100
发送消息
P2PMESSAGEACK
101
收到消息的应答
P2PSOMEONEWANTTOCALLYOU
102
服务器向客户端发送的消息
希望此客户端发送一个UDP打洞包
P2PTRASH
103
客户端发送的打洞包,接收端应该忽略此消息
客户端之间发送消息格式
stP2PMessage
iStringLen;
or
IP
address
Port;
using
namespace
std;
typedef
list<
*>
UserList;
2.4程序的运行和测试
1.程序的运行
用户在客户端填入必要的信息后,向服务器提交自己的信息。
服务器将按照一定的规则给用户生成一个可用的用户账号,并把此账号返回给用户,用户以后便可以用此账号登录本系统,来和网络上的其它本系统的用户进行及时的收发信息来聊天。
在以后的每一次登录中系统都将对用户进行身份验证,以确定该用户是否为合法的用户
用户在登录界面输入用户ID和密码,系统进行用户身份验证,如果通过用户身份验证则转入相应的工作界面,如果没有通过用户身份验证则显示下列信息:
用户名与密码不符用户可以重新输入正确的ID和密码。
选择通讯对象后,如果是聊天则用户发送信息实时在交流对象的客户端显示。
待有客户端反馈信息时,将会显示在用户相应工作界面中。
如果是传输文件则再弹出对话框让用户选择需要传输的文件,并发送传输文件的请求信息,对方接受到请求信息,同意后建立文件传输的连接进行文件传输。
在以后的每一次登录中系统都将对用户进行身份验证,以确定该用户是否为合法的用户。
图2.4结果截图
2.系统测试
测试的目的是为了发现功能是否达到,或者是否有更多的缺陷。
当两个客户端在建立连接时,出现过程序假死异常。
分析代码发现,线程调度出错,接收消息线程th还未创建和启动,监听线程wait已经被销毁了。
修改代码,给出两种解决办法:
(1)在th线程的执行方法中,将wait线程销毁;
在th线程销毁前,重新开启wait线程。
(2)wait线程不销毁。
设置一bool类型变量isconnected,当已经建立连接后,isconnected=true,若再有其他的连接请求到达,自动将其他连接请求拒绝。
连接断开后,重置isconnected=false,将处理移交给用户。
我采用了第一种方法,调试之后,问题解决。
在程序退出时,常常发生错误,异常退出,造成表面上看程序已结束,但却仍然驻留在内存中的现象。
经过反复分析代码,最终确定问题出在程序退出处理流程上,通过修改和调试,问题解决。
整个开发过程中,共历经200多次相互断开、连接测试,P2P文本聊天模块终于可以正常运行。
借助在P2P文本聊天模块开发过程中积累的经验,较顺利的完成了P2P文件传输模块的开发。
通过在总集成后的程序的各个流程中添加消息提示框显示程序内部数据、对象的状态,并插入断点进行单步跟踪发现各模块工作正常,数据也未发生异常现象。
(1)程序启动之后就能看到当前哪些机器在线,哪些可以与之进行对等通信。
(2)一旦有某个网内的机器上线了,要有即时通知,并能及时更新用户界面中的用户列表。
(3)当双击某个列表项的时候,要弹出聊天对话框,可以在其中编辑要发送的聊天信息,并进行发送。
(4)聊天界面要人性化,下面是发送框,上面有已有聊天记录,并借助滚动条看到当次所有的聊天记录。
(5)当有远程用户向本机发送文件的时候,要弹出一个消息提示框,提示本机用户,可以选择接收或者拒绝。
(6)当用户觉得有必要保存聊天记录时,提供一个简单的聊天记录保存功能。
(7)文件传输过程中,应该有当前传输状态提示,并能够对传输耗时等进行计算,作为当前网络状态的一种反馈。
经检查,当用户输入无效操作时,系统总是能检测到无效操作,对用户进行相应的信息反馈,并合理的做出内部处理。
当系统本身发生错误,比如网络初始化失败,绑定套接字失败,数据读取失败等,都会进行相对应的正确处理。
例如当文件传输时,用户输入的文件不存在,而单击“开始”时,会有如图2.5所示的错误提示。
图2.5用户操作出错信息提示示意图
第3章课程设计总结
通过这些时间的开发设计,开发基于Socket的聊天系统已经可以按照预定要求实现功能,完全实现了P2P的聊天、文件传输等功能。
随着科技的发展和社会的进步,P2P的聊天系统将需要得到进一步改善,相应的功能模块也应相应的增加,比如多媒体方面的内容,以满足用户需求。
基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟,比如较早的ICQ,MSNMessenger,Yahoo。
除了这些国外开发的产品,还有国产的有名的QQ,新浪UC,LAVA-LAVA等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等。
这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP协议的软件产品。
通过此次的论文,我学到了很多知识,跨越了传统方式下的教与学的体制束缚,在论文的写作过程中,通过查资料和搜集有关的文献,培养了自学能力和动手能力。
并且由原先的被动的接受知识转换为主动的寻求知识,这可以说是学习方法上的一个很大的突破。
在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过毕业论文,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。
在论文的写作过程中也学到了做任何事情所要有的态度和心态,首先做学问要一丝不苟,对于发展过程中出现的任何问题和偏差都不要轻视,要通过正确的途径去解决,在做事情的过程中要有耐心和毅力,不要一遇到困难就达退堂鼓,只要坚持下去就可以找到思路去解决问题的。
而且要学会与人合作,这样做起事情来就可以事倍功半。
总之,此次课设的写作过程,我收获了很多,即为将来的人生之路做好了一个很好的铺垫。
参考资料
[1]KarliWatson,ChristianNagel等.C#入门经典(第3版)[M].北京:
清华大学出版社.2004.
[2]宋振会.SQLServer2000中文版基础教程[M].北京:
清华大学出版社.2005.
[3]KarliWatson等.BeginningVisualC#2005[M].北京:
清华大学出版.社.2005.
[4]JimArlowIlaNeustadt.UML和统一过程[M].北京:
机械工业出版社.2003.2.
[5]佩里.C#和.NET核心技术[M].北京:
机械工业出版社.2006.7.
[6]天极网新技术研究室.ASP.NET完全入门[M].北京:
重庆出版社.2001.
[7]ScottWorley.ASP.NET技术内幕[M].北京:
人民邮电出版社.2002.
[8]刘斌,张军.ASP.NET+SQLServer动态网站开发案例精选[M].北京:
[9]卢潇主.软件工程[M].北京:
[10]MichaelAmundsen,PaulLitwin,Asp.NET开发人员指南[M].北京:
中国电力出版社.2003.
[11]HeatherOsterloh著.TCP/IPPrimerPlus[M].张金祥译.北京:
[12]
WarrenW.Gay著.实战LinuxSocket编程.西安电子科技大学出版社.2002年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Socket 聊天室 管理 系统