c#实现网络聊天室socket仿QQ课程设计范本模板.docx
《c#实现网络聊天室socket仿QQ课程设计范本模板.docx》由会员分享,可在线阅读,更多相关《c#实现网络聊天室socket仿QQ课程设计范本模板.docx(37页珍藏版)》请在冰豆网上搜索。
![c#实现网络聊天室socket仿QQ课程设计范本模板.docx](https://file1.bdocx.com/fileroot1/2023-1/27/edab77e0-4f8b-49ce-85f8-7ffe15e095e0/edab77e0-4f8b-49ce-85f8-7ffe15e095e01.gif)
c#实现网络聊天室socket仿QQ课程设计范本模板
VisualC#程序设计
课程设计(报告)
题目:
网络聊天室
专业班级:
地信131
学生姓名:
胡宏勇
学号:
1220130912
完成时间:
_________2015.7。
12______________________
任务书
项目四网络聊天室
4。
1、目的与要求
1.目的:
1)要求学生达到熟练掌握.NET基本结构以及C#语言的基本知识和技能;
2)基本掌握面向对象程序开发的基本思路和方法;
3)掌握网络程序开发的基本知识;
4)能够利用所学的基本知识和技能,进行简单的网络通信程序设计。
2。
要求
基本要求:
1)要求利用C#的编程思想以及套接字开发原理来完成系统的设计;
2)突出C#语言与其它语言不同点(即体现C#的高级功能,如属性概念、接口、事件、委托等);
3)体现可视化编程基本东西,如系统带有菜单、工具栏、状态栏以及一些
常用的高级控件。
创新要求:
在基本要求达到后,可进行创新设计,如加入文件传输功能,以及远程控制功能。
4.2、信息描述
有关该系统基本信息的描述,如:
客户端实例的信息等。
类似于QQ。
4.3、功能描述
1。
聊天室服务器端的创建。
2。
聊天室客户端的创建.
3。
实现客户与服务器的连接通讯。
4.实现客户之间的私聊。
5。
实现客户端的在线信息显示.
6。
实现服务器端当前在线客户信息.
7.保存谈话记录。
4.4、解决方案
1.首先进行需求分析,搞清楚系统功能和任务.
2.然后总体设计中确定模块结构,划分功能模块,将软件功能需求分配给所划分的最小单元模块。
确定模块间的联系,确定数据结构、文件结构、数据库模式,确定测试方法与策略.
3。
详细设计中为每个模块确定采用的算法,选择适当的工具表达算法的过程(流程图),描述模块的详细过程;确定每一模块使用的数据结构;确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其它模块的接口。
4.依据分析编写C#代码。
1.需求分析——---——--—-—-——---—-1
1。
1摘要
1.2系统开发背景
1。
3聊天软件的开发目标
2.概要设计-—-————---—--—-———--2
2。
1服务器端
2。
2客户端
3.详细设计——-———--—————-----—-3
4。
编码-——-———————-——-———-—6
4.1服务器端核心编码
4.2客户端核心代码
5.调试分析-—-——-—-—————-——---18
6.用户使用说明——--—--—-———-----27
7.课程设计总结—----—-—-—-——-——28
8.参考文献-————————--—---—---28
1。
需求分析
1。
1摘要
作为除电视、报纸、广播之外的第四大媒体,互联网不仅成为人们获取新闻信息的主要来源,更成为了人们闲暇之余的一种休闲手段。
随着互联网技术的发展,各种各样基于网络的应用也随之诞生,网络聊天工具便是其中的一种。
本文采用VisualStudio2010+SQLServer2008开发环境,结合WinForms、ADO。
NET等多种技术,实现了一个类似QQ的网络聊天工具,并在WINDOWS平台上加以了实现。
通过C#语言进行网络编程,通过公共的数据库交换各种信息,实现了人性化的界面设计与功能设计.软件经过测试,满足现代人们即时通信的需求,达到预期的设计效果,对网络聊天工具的人性化设计具有一定的现实意义,同时也为其他相关项目的设计提供了参考。
关键词:
网络聊天工具C#即时通信数据库人性化
1.2系统开发背景
在互联网相当普及的今天,你们对网络的依赖越来越大,越来越离不开网络,网络聊天更是成为了人们的“家常便饭"。
通过网络聊天工具,人们足不出户就可进行闲聊甚至工作会谈,极大地方便了人们的日常生活与工作需求。
常用的网络聊天工具主要是QQ与MSN。
MSN主要用于国际,而国内的主流网络聊天工具是QQ。
为了方便同学之间的交流,我决定设计一个类似QQ并且无垃圾信息的网络聊天工具,此外也希望通过本次课程设计能更好地学习与掌握网络软件编程知识。
1.3聊天软件的开发目标
本次课程设计的主要工作是设计一个类似QQ的网络即时聊天工具,主要是采用WinForms+ADO。
NET+Socket通信技术实现.软件功能主要包括用户注册、用户登录、用户间聊天、查找/添加好友、个人设置以及服务器的搭建等。
客户端通过公共的数据库交换信息,消息的发送和读取都是通过Socket通信技术和操作数据库来完成的。
在程序中采用定时扫描数据库的方式来查找登录用户。
以及Socket通信技术实现信息交换.
2。
概要设计
(1)数据库端
MODEL类:
数据库的模型层包括Users(用户层)Stars(用户所对应的星座)Friends(用户之间的好友关系层)BloodType(用户所对应的血型)
DAL类:
sqlHelper(数据库与数据层DAL的连接类)UsersDAL(用户的数据层)StasDAL(用户所对应的星座数据层)FriendsDAL(用户之间的好友关系的数据层)BloodTypeDAL(用户所对应的血型的数据层)
BLL类:
UsersBLL(用户的业务层)StarsBLL(用户所对应的星座的业务层)
FriendsBLL(用户之间的好友关系的业务层)BloodTypeBLL(用户所对应的血型的业务层)
(2)服务器端
Server类:
ClientManager(客户端通信管理类)DGSendMsg(显示消息的委托类)MainServer(主窗体)
(3)客户端
新建客户端类:
Login(登录主窗体)FrmInformation(登录后的消息提示)MainList(主界面与聊天窗口)AddFriend(通过Id添加好友)Apply(申请号码)forgetpwd(找回密码)HeadList(选择更换头像)MyDetail(个人详细资料设计)MyHead(浮动头像框)Search(不同条件查询好友)
3.详细设计
设计中定义的所有数据类型涉及太多就不一一列出,下面是我程序个个的调用流程图。
(1)(模型层-数据层—业务层)
(业务层与UI层)
(客户端与服务器通信)
4。
编码
(1)(服务器端核型代码)
//服务器监听套接字
SocketsokServer=null;
//监听线程
ThreadthrServer=null;
//客户端管理类
ClientManagerclientManage=null;
BLL。
UsersBLLuserBll=newBLL。
UsersBLL();
//点击开启服务器
privatevoidbtnSerStar_Click(objectsender,EventArgse)
{
try
{
sokServer=newSocket(AddressFamily.InterNetwork,SocketType。
Stream,ProtocolType。
Tcp);
IPAddressip=IPAddress.Parse(txtSerIP.Text.Trim());
//创建端口号对象
IPEndPointpoint=newIPEndPoint(ip,int。
Parse(txtSerPort。
Text。
Trim()));
//监听
sokServer.Bind(point);
//最多连几个
sokServer。
Listen(Convert.ToInt32(cmbSerMax.SelectedItem));
//开启新线程
thrServer=newThread(WatchConnection);
thrServer。
IsBackground=true;
thrServer。
Start();
//管理类对象实例化
clientManage=newClientManager(listChat,AppendMsg);
AppendMsg(”开始监听~~~~!
"+DateTime。
Now.ToString());
}
catch(Exceptionex)
{
MessageBox.Show(”异常:
"+ex。
Message+DateTime.Now。
ToString());
AppendMsg(”异常:
”+ex.Message+"1"+DateTime.Now。
ToString());
}
}
boolisWatching=true;
voidWatchConnection()
{
try
{
while(isWatching)
{
//负责通信的socket
SocketsokMsg=sokServer。
Accept();
//加入通信管理类
clientManage.AddClient(sokMsg);
txtOnlineCount。
Text=listChat.Items。
Count.ToString();
}
}
catch(SocketExceptionex1)
{
AppendMsg("异常:
”+ex1.Message+"2”+DateTime。
Now.ToString());
}
catch(Exceptionex)
{
AppendMsg(”异常:
”+ex。
Message+"3”+DateTime。
Now.ToString());
}
}
//通信管理类
///〈summary〉
///客户端管理
///〈/summary〉
publicclassClientManager
{
//好友列表控件
privateSystem。
Windows.Forms。
ListBoxlistClient;
DGSendMsgdgSendMsg;
//通信套接字key:
客户端ipvalue:
对应的通信套接字
privateDictionaryClientSocket;
publicClientManager()
{}
///〈summary>
///客户端管理类
///〈/summary>
///〈paramname=”lb">列表控件
///〈paramname=”dgSendMsg"〉显示消息〈/param〉
publicClientManager(System。
Windows.Forms。
ListBoxlb,DGSendMsgdgSendMsg)
{
this.listClient=lb;
this。
dgSendMsg=dgSendMsg;
//dictClientSocket=newDictionary();
ClientSocket=newDictionary}
///
///添加通信套接字
///
///〈paramname="sokMag”>负责通信的socket〈/param>
publicvoidAddClient(SocketsokMsg)
{
//获取客户端通信套接字
stringstrEndPoint=sokMsg。
RemoteEndPoint。
ToString();
//通信套接字加入字典
ClientSocket。
Add(strEndPoint,sokMsg);
//显示列表
System.Threading.Thread。
Sleep(500);
BLL.UsersBLLuserbll=newUsersBLL();
Usersadduser=userbll。
SelectByIp(strEndPoint);
listClient。
Items。
Add(strEndPoint+"-——"+adduser.Name+”——-”+adduser.Id+"—-—"+DateTime。
Now。
ToString());
ThreadthrMag=newThread(ReciveMsg);
thrMag.IsBackground=true;
thrMag。
Start(sokMsg);
dgSendMsg(strEndPoint+”成功连接上服务端~~~!
"+DateTime。
Now。
ToString());
}
boolisReceing=true;
voidReciveMsg(objectsokMsgObj)
{
SocketsokMsg=null;
try
{
//sokMsg接收消息的socket
sokMsg=sokMsgObjasSocket;
byte[]arrMsg=newbyte[5*1024*1024];
while(isReceing)
{
//接收到消息
//测试
intrealLength=sokMsg。
Receive(arrMsg);
if(realLength==0)
{
RemoveClient(sokMsg。
RemoteEndPoint.ToString());
}
stringstrMsg=Encoding.UTF8.GetString(arrMsg,0,realLength);
//dgSendMsg(strMsg);
SendMsgToClient(strMsg);
string[]msgTxt=strMsg。
Split(’|');
if(msgTxt.Length<1)
{
RemoveClient(sokMsg.RemoteEndPoint。
ToString());
}
}
}
catch
{
RemoveClient(sokMsg.RemoteEndPoint.ToString());
}
}
publicvoidRemoveClient(stringstrClientID)
{
if(listClient。
Items.Contains(strClientID))
{
listClient。
Items.Remove(strClientID);
}
if(ClientSocket.Keys。
Contains(strClientID))
{
ClientSocket[strClientID].Close();
ClientSocket.Remove(strClientID);
}
}
publicvoidSendMsgToClient(stringMsg)
{
//解析发来的数据
string[]msgTxt=Msg.Split('|');
//不可解析数据
if(msgTxt.Length<2)
{
return;
}
stringstrTo=msgTxt[1];
intstrToId=Convert。
ToInt32(strTo);
UsersuserTo=newBLL.UsersBLL()。
SelectById(strToId);
if(ClientSocket.Keys。
Contains(userTo.IP))
{
byte[]buffer=System。
Text。
Encoding.UTF8.GetBytes(Msg);
Socketconn=ClientSocket[userTo。
IP];
conn。
Send(buffer);
}
}
(客户端)
//与服务器通信的socket
#regionsokConnect()负责通信的socket
voidsokConnect()
{
//负责通信的socket
try
{
socketSent=newSocket(AddressFamily。
InterNetwork,SocketType。
Stream,ProtocolType。
Tcp);
IPAddressip=IPAddress。
Parse(txtIP.Text.Trim());
socketSent。
Connect(ip,Convert。
ToInt32(txtProt。
Text。
Trim()));
//showmsg(”连接成功");
//将IP更新回数据库
newBLL.UsersBLL()。
UpDateIp(nowuser.Id,socketSent。
LocalEndPoint。
ToString());
//接收消息,的新线程
Threadth=newThread(recive);
//后台运行
th.IsBackground=true;
th。
Start();
}
catch(Exception)
{
MessageBox.Show(”服务器异常”);
//this。
Close();
}
}
#endregion
//解析服务端发来的消息
#region服务端发来的消息
///〈summary〉
///服务端发来的消息
///〈/summary〉
voidrecive()
{
try
{
while(true)
{
byte[]buffer=newbyte[1024*1024*5];
intr=socketSent.Receive(buffer);
if(r==0)
{
break;
}
//一般文字消息
if(buffer[0]==0)
{
//不解析第一位0
stringstr=Encoding。
UTF8。
GetString(buffer,1,r-1);
string[]msgTxt=str.Split('|’);
stringstrFrom=msgTxt[0];
intstrFromId=Convert.ToInt32(strFrom);
Usersuserfrom=newBLL。
UsersBLL()。
SelectById(strFromId);
//使用FileStream来写入数据
//File。
AppendAllText()
stringnewstr=userfrom.Name+":
"+msgTxt[2]+”____["+DateTime。
Now。
ToString()+"]"+"\r\n";
if(userfrom。
Id==nowfriend.Id)
{
showmsg(newstr);
}
else
{
for(inti=0;iCount;i++)
{
if(listView。
Items[i].Text==nowfriend。
Name+”("+nowfriend.Id+")”)
{
}
else
{
if(listView.Items[i]。
Text==userfrom。
Name+"("+userfrom。
Id+")")
{
listView.Items[i]。
Text=userfrom.Name+”(”+userfrom.Id+”)”+".。
。
好友发来消息”;
}
}
}
}
using(FileStreamfsWrite=newFileStream(path+"\\”+userfrom。
Id+".txt”,FileMode.Append,FileAccess。
Write))
{
byte[]newbuffer=Encoding。
UTF8。
GetBytes(newstr);
fsWrite.Write(newbuffer,0,newbuffer。
Length);
}
}
//解析文件
elseif(buffer[0]==1)
{
stringstr=Encoding。
UTF8。
GetString(buffer,1,r-1);
string[]msgTxt=str。
Split('|’);
stringstrFrom=msgTxt[0];
intstrFromId=Convert.ToInt32(strFrom);
Usersuserfrom=newBLL。
UsersBLL().SelectById(strFromId);
//使用FileStream来写入数据
//File。
AppendAllText()
stringnewstr=userfrom.Name+":
"+"发送了一个文件"+”____["+DateTime.Now。
ToString()+"]"+"\r\n";
if(userfrom。
Id==nowfriend.Id)
{
showmsg(newstr);
}
using(FileStreamfsWrite=newFileStream(path+"\\”+userfrom。
Id+”.txt",FileMode.Append,FileAccess。
Write))
{
byte[]newbuffer=Encoding.UTF8.GetBytes(newstr);
fsWrite。
Write(newbuffer,0,newbuffer.Length);
}
if(MessageBox。
Show(”好友”+nowfriend.Name+"发来一个文件是否接收",”收到文件",MessageBoxButtons.YesNo)==DialogResult.Yes)
{
SaveFileDialogsfd=new