c#实现网络聊天室(socket)仿QQ课程设计.doc_第1页
c#实现网络聊天室(socket)仿QQ课程设计.doc_第2页
c#实现网络聊天室(socket)仿QQ课程设计.doc_第3页
c#实现网络聊天室(socket)仿QQ课程设计.doc_第4页
c#实现网络聊天室(socket)仿QQ课程设计.doc_第5页
免费预览已结束,剩余29页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Visual C#程序设计课 程 设 计(报告)题目: 网络聊天室 专业班级: 地信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. 概要设计 - - - - - - - - - - - - - - - - - - - - 22.1 服务器端2.2 客户端3. 详细设计 - - - - - - - - - - - - - - - - - - - - 34.编码 - - - - - - - - - - - - - - - - - - - - 64.1 服务器端核心编码4.2 客户端核心代码5. 调试分析 - - - - - - - - - - - - - - - - - - - 18 6.用户使用说明 - - - - - - - - - - - - - - - - - 27 7.课程设计总结 - - - - - - - - - - - - - - - - 288.参考文献 - - - - - - - - - - - - - - - - - - - 28 1.需求分析 1.1摘 要作为除电视、报纸、广播之外的第四大媒体,互联网不仅成为人们获取新闻信息的主要来源,更成为了人们闲暇之余的一种休闲手段。随着互联网技术的发展,各种各样基于网络的应用也随之诞生,网络聊天工具便是其中的一种。本文采用Visual Studio 2010+SQL Server 2008开发环境,结合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)(模型层-数据层-业务层)Users(用户层)StarsBLLFriendsBLLBloodTypeBLLUsersBLL业务层BLLSQLServersqlHelper数据层DALUsersDALStasDALFriendsDALBloodTypeDALBloodType(用户所对应的血型)Stars(用户的星座)Friends(用户好友关系层)模型层MODEL(业务层与UI层) 业务层 用户详细信息以及当前登录的IP和端口号(客户端与服务器通信)4.编码 (1)(服务器端核型代码) /服务器监听套接字 Socket sokServer = null; /监听线程 Thread thrServer = null; /客户端管理类 ClientManager clientManage = null; BLL.UsersBLL userBll = new BLL.UsersBLL(); /点击开启服务器 private void btnSerStar_Click(object sender, EventArgs e) try sokServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(txtSerIP.Text.Trim(); /创建端口号对象 IPEndPoint point = new IPEndPoint(ip, int.Parse(txtSerPort.Text.Trim(); / 监听 sokServer.Bind(point); /最多连几个 sokServer.Listen(Convert.ToInt32(cmbSerMax.SelectedItem); /开启新线程 thrServer = new Thread(WatchConnection); thrServer.IsBackground = true; thrServer.Start(); /管理类对象实例化 clientManage = new ClientManager(listChat, AppendMsg); AppendMsg(开始监听! + DateTime.Now.ToString(); catch (Exception ex) MessageBox.Show(异常: + ex.Message + DateTime.Now.ToString(); AppendMsg(异常: + ex.Message + 1 + DateTime.Now.ToString(); bool isWatching = true; void WatchConnection() try while (isWatching) /负责通信的socket Socket sokMsg = sokServer.Accept(); /加入通信管理类 clientManage.AddClient(sokMsg); txtOnlineCount.Text = listChat.Items.Count.ToString(); catch (SocketException ex1) AppendMsg(异常: + ex1.Message + 2+DateTime.Now.ToString(); catch (Exception ex) AppendMsg(异常: + ex.Message + 3 + DateTime.Now.ToString(); /通信管理类/ / 客户端管理 / public class ClientManager /好友列表控件 private System.Windows.Forms.ListBox listClient; DGSendMsg dgSendMsg; /通信套接字key :客户端ip value :对应的通信套接字 private Dictionary ClientSocket; public ClientManager() / / 客户端管理类 / / 列表控件 / 显示消息 public ClientManager(System.Windows.Forms.ListBox lb,DGSendMsg dgSendMsg) this.listClient = lb; this.dgSendMsg = dgSendMsg; / dictClientSocket = new Dictionary(); ClientSocket = new Dictionary(); / / 添加通信套接字 / / 负责通信的socket public void AddClient(Socket sokMsg) /获取客户端通信套接字 string strEndPoint = sokMsg.RemoteEndPoint.ToString(); /通信套接字加入字典 ClientSocket.Add(strEndPoint, sokMsg); /显示列表 System.Threading.Thread.Sleep(500); BLL.UsersBLL userbll = new UsersBLL(); Users adduser= userbll.SelectByIp(strEndPoint); listClient.Items.Add(strEndPoint + - + adduser.Name + - + adduser.Id + - + DateTime.Now.ToString(); Thread thrMag = new Thread(ReciveMsg); thrMag.IsBackground = true; thrMag.Start(sokMsg); dgSendMsg(strEndPoint + 成功连接上服务端! + DateTime.Now.ToString(); bool isReceing = true; void ReciveMsg(object sokMsgObj) Socket sokMsg=null; try /sokMsg接收消息的socket sokMsg = sokMsgObj as Socket; byte arrMsg = new byte5 * 1024 * 1024; while (isReceing) /接收到消息 /测试 int realLength = sokMsg.Receive(arrMsg); if (realLength=0) RemoveClient(sokMsg.RemoteEndPoint.ToString(); string strMsg = Encoding.UTF8.GetString(arrMsg, 0, realLength); /dgSendMsg(strMsg); SendMsgToClient(strMsg); string msgTxt = strMsg.Split(|); if (msgTxt.Length1) RemoveClient(sokMsg.RemoteEndPoint.ToString(); catch RemoveClient(sokMsg.RemoteEndPoint.ToString(); public void RemoveClient(string strClientID) if (listClient.Items.Contains(strClientID) listClient.Items.Remove(strClientID); if (ClientSocket.Keys.Contains(strClientID) ClientSocketstrClientID.Close(); ClientSocket.Remove(strClientID); public void SendMsgToClient(string Msg) /解析发来的数据 string msgTxt = Msg.Split(|); /不可解析数据 if (msgTxt.Length 2) return; string strTo = msgTxt1; int strToId = Convert.ToInt32(strTo); Users userTo = new BLL.UsersBLL().SelectById(strToId); if (ClientSocket.Keys.Contains(userTo.IP) byte buffer = System.Text.Encoding.UTF8.GetBytes(Msg); Socket conn = ClientSocketuserTo.IP; conn.Send(buffer); (客户端)/与服务器通信的socket #region sokConnect()负责通信的socket void sokConnect() /负责通信的socket try socketSent = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(txtIP.Text.Trim(); socketSent.Connect(ip, Convert.ToInt32(txtProt.Text.Trim(); / showmsg(连接成功); /将IP更新回数据库 new BLL.UsersBLL().UpDateIp(nowuser.Id, socketSent.LocalEndPoint.ToString(); / 接收消息,的新线程 Thread th = new Thread(recive); /后台运行 th.IsBackground = true; th.Start(); catch (Exception) MessageBox.Show(服务器异常); /this.Close(); #endregion/解析服务端发来的消息 #region 服务端发来的消息 / / 服务端发来的消息 / void recive() try while (true) byte buffer = new byte1024 * 1024 * 5; int r = socketSent.Receive(buffer); if (r = 0) break; /一般文字消息 if (buffer0 = 0) /不解析第一位0 string str = Encoding.UTF8.GetString(buffer, 1, r - 1); string msgTxt = str.Split(|); string strFrom = msgTxt0; int strFromId = Convert.ToInt32(strFrom); Users userfrom = new BLL.UsersBLL().SelectById(strFromId); /使用FileStream来写入数据 /File.AppendAllText() string newstr = userfrom.Name + : + msgTxt2 + _ + DateTime.Now.ToString() + + rn; if (userfrom.Id=nowfriend.Id) showmsg(newstr); else for (int i=0; ilistView.Items.Count;i+) if (listView.Itemsi.Text=nowfriend.Name+(+nowfriend.Id+) else if (listView.Itemsi.Text = userfrom.Name + ( + userfrom.Id + ) listView.Itemsi.Text= userfrom.Name + ( + userfrom.Id + )+.好友发来消息; using (FileStream fsWrite = new FileStream(path + + userfrom.Id + .txt, FileMode.Append, FileAccess.Write) byte newbuffer = Encoding.UTF8.GetBytes(newstr); fsWrite.Write(newbuffer, 0, newbuffer.Length); /解析文件 else if (buffer0 = 1) string str = Encoding.UTF8.GetString(buffer, 1, r - 1); string msgTxt = str.Split(|); string strFrom = msgTxt0; int strFromId = Convert.ToInt32(strFrom); Users userfrom = new BLL.UsersBLL().SelectById(strFromId); /使用FileStream来写入数据 /File.AppendAllText() string newstr = userfrom.Name + : + 发送了一个文件 + _ + DateTime.Now.ToString() + + rn; if (userfrom.Id = nowfriend.Id) showmsg(newstr); using (FileStream fsWrite = new FileStream(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) SaveFileDialog sfd = new SaveFileDialog(); sfd.Title = 保存文件; sfd.Filter = 全部文件|*.*; sfd.InitialDirectory = C:UsersAdministratorDesktop; sfd.ShowDialog(this); using (FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate, FileAccess.Write) fs.Write(buffer, 1, r - 1); MessageBox.Show(保存成功); using (FileStream fsWrite = new FileStream(path + + userfrom.Id + .txt, FileMode.Append, FileAccess.Write) byte newbuffer = Encoding.UTF8.GetBytes(接收成功); fsWrite.Write(newbuffer, 0, newbuffer.Length); else using (FileStream fsWrite = new FileStream(path + + userfrom.Id + .txt, FileMode.Append, FileAccess.Write) byte newbuffer = Encoding.UTF8.GetBytes(接收不成功); fsWrite.Write(newbuffer, 0, newbuffer.Length); /解析抖动 else if (buffer0 = 2) string str = Encoding.UTF8.GetString(buffer, 1, r - 1); string msgTxt = str.Split(|); string strFrom = msgTxt0; int strFromId = Convert.ToInt32(strFrom); Users userfrom = new BLL.UsersBLL().SelectById(strFromId); string newstr = userfrom.Name + : + 震动了一下+ _ + DateTime.Now.ToString() + + rn; if (userfrom.Id = nowfriend.Id) showmsg(newstr); for (int i = 0; i 100; i+) Random rd = new Random(); int x = rd.Next(200, 250); Random rx = new Random(); int y = rx.Next(200, 250); this.Location = new Point(x, y); System.Threading.Thread.Sleep(5); Application.DoEvents(); using (FileStream fsWrite = new FileStream(path + + userfrom.Id + .txt, FileMode.Append, FileAccess.Write) byte newbuffer = Encoding.UTF8.GetBytes(newstr); fsWrite.Write(newbuffer, 0, newbuffer.Length); catch #endregion /点击发送文字信息 private void btnsent_Click(object sender, EventArgs e) try string newstr = 我 + : + textBox4.Text.Trim() + _ + DateTime.Now.ToString() + + r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论