已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络编程技术课程设计报告课程设计题目:局域网点对点通信软件与实现作者所在系部: 计算机科学与工程系 作者所在专业: 网络工程 作者所在班级: 作 者 姓 名 : 作 者 学 号 : 指导教师姓名: 完 成 时 间 : 2013年07月10日 课程设计任务书课题名称局域网点对点通信软件设计与实现完成时间 20周指导教师职称讲师学生姓名班 级总体设计要求和技术要点1. 总体功能描述:(1)本软件采用单纯P2P方式,各个客户端之间可以直接发送消息和传输文件;(2)根据选中的用户,实现一对一或一对多通信。(3)软件中包括在线的用户信息列表、通信信息列表(聊天及文件传输)等。(4)实现用户的动态加入和退出。(5)在线列表中记录登陆的主机名称及IP地址信息。(6)客户端定期发送心跳包,表示本客户端的存在。2. 开发工具: 采用Visual Studio 2010,编程语言为C#。3. 采用技术: 多线程技术、Socket通信技术、TCP、UDP通信技术,P2P技术等。4. 基本要求: 操作简便 功能齐全,风格统一 没有明显错误和异常工作内容及时间进度安排119周:需求分析及项目的设计与实现220周:项目验收与答辩,撰写课程设计报告课程设计成果1局域网点对点通信软件2课程设计报告书摘要所谓网络中的点对点通信是实现网络上不同计算机之间,不经过任何中继设备而直接交换数据或服务的一种技术。由于允许网络中任何一台计算机可以直接连到网络中的其他计算机,并与之进行数据交换,这样既可以消除中间环节,也使得网络上的沟通变的更加容易、更加直接。本文介绍的是一种是用Winsock编程技术,基于TCP/IP协议的、面向连接的流式套接字网络通信编程设计。局域网即时通讯软件使用TCP协议作为传输层的协议,采用点对点模式服务,不需要服务器支持,使局域网用户的使用更加方便和高效。它可以实现局域网用户的自动检测,用户间文本信息的交流,文件的传输等功能。本系统使用Visual Studio 2010作为开发工具,将.NET中的一些技术运用到系统中关键词:点对点;TCP/IP;Socket;UDP;P2P目 录摘要2目 录3第1章 绪论41.1课题研究现状分析41.2选题的目的及意义4第2章 系统需求分析52.1 问题的提出52.2 系统的设计目标5第3章 系统总体设计63.1系统功能设计63.2功能模块的说明73.2.1初始化(广播用户信息)73.2.2用户列表管理73.2.3文本信息传输73.2.4文件传输73.2.5发送心跳包7第4章 系统实现84.1初始化模块的设计和实现84.1.1监听端口84.2 广播消息84.3 文本消息的发送和接收94.4 文件的发送和接收124.5发送心跳包14第5章 课程设计总结165.1 主要问题及解决办法165.2 课程设计体会165.3 自我评定16参考文献17第1章 绪论1.1课题研究现状分析随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式已经难以满足人们的交流要求,在互联网或局域网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。作为整个计算机网络的基础,局域网用户之间进行即时通许的需求更大,而且他们之间进行文件传输与共享的频率更高,因此有必要设计一款专门为局域网用户使用的即时通讯软件。当前存在的即时通讯软件很多,但其中很多一部分由于嵌入了太多的娱乐功能而不很实用。对于局域网用户来说,首先,由于他们之间进行通讯的不确定性和随机性,所以如果专门为他们建立一个服务器端的话,势必会造成很大的浪费,因此,本软件选择实用点对点服务模式,不需要服务器支持。其次,局域网用户之间进行交流的主要方式及时文字信息交流,因此,本软件实现的最基本的功能就是文字信息的传输。再次,局域网用户要频繁的进行文件的传输,所以本软件还实现了两个用户之间文件的传输。1.2选题的目的及意义随着计算机和Internet的飞速发张,网上聊天已成为人们相互交流的一中方式,与E-mail,电话相比,聊天服务更具有实时性和有效性。网络版的聊天软件种类繁多,如QQ,MSN等,实时随时随地上网聊天,给人们带来了很大的方便。但是这些聊天软件业存在以下不足:用户必须连接Internet;用户工作时容易沉迷于网络聊天。为了方便单位企业内部的信息交流,避免企业内部员工使用类似QQ等软件泄露内部消息,减少不必要的财力和人力资源浪费,开发一耳光局域网聊天软件是非常必要的。 第2章 系统需求分析2.1 问题的提出为了满足人们在局域网内部进行安全、有效、快速的沟通以及文件的传输的目的。2.2 系统的设计目标(1)本软件采用单纯P2P方式,各个客户端之间可以直接发送消息和传输文件;(2)根据选中的用户,实现一对一或一对多通信。(3)软件中包括在线的用户信息列表、通信信息列表(聊天及文件传输)等。(4)实现用户的动态加入和退出。(5)在线列表中记录登陆的主机名称及IP地址信息。(6)客户端定期发送心跳包,表示本客户端的存在。16第3章 系统总体设计3.1系统功能设计 本软件可以实现局域网内用户的自动检测,用户之间的文件信息交流,文件传输等功能。据此,本设计的功能模块可以分为5个:广播用户信息,用户列表管理,文字信息传输,文件传输,发送心跳包。系统的总功能模块图如图3-1所示:图3-1 系统功能模块图用户主界面如图3-2所示:图3-2用户界面图3.2功能模块的说明3.2.1初始化(广播用户信息)该模块的主要功能是搜集本机用户的相关信息,如计算机名,IP地址,初始化Socket,开始监听端口,并把本机用户的信息通过广播消息发送出去。3.2.2用户列表管理该模块的主要功能是对收到的用户信息进行管理,包括用户列表的更新,用户信息查找,同时还要对其他用户的广播消息进行反馈。3.2.3文本信息传输该模块的主要功能是把当前文本框的内容发送给当前选中的用户,分为私聊和群聊,如果发送成功,则把当前文本框的内容加上某些必须的信息在聊天记录文本框中显示,同时清空输入文本框。该模块还要具有纠正用户为空(为选中用户)或者发送内容为空的情况。3.2.4文件传输该模块的主要功能是实现两个用户之间的点对点的文件传输。使用TCP协议进行传输,能确保文件发送过程中不出现丢失现象。3.2.5发送心跳包该模块的主要功能是检测用户是否在线。第4章 系统实现4.1初始化模块的设计和实现使用Socket编程都是使用的是一些绑定端口和IP的普通的程序,而UDP数据报则支持向局域网内的所有用户发送组播消息,即向ip发送消息,局域网内所有监听相同端口的UDPClient都会收到该消息。4.1.1监听端口 本程序中用到了大量的Socket Udp发送和接收数据的操作,所以把这些相关操作定义为一个组件,这样就简化了程序中其他部分的代码;private UdpClient udpClient;private int port = 8002;private void Form1_Load_1(object sender, EventArgs e) Thread myThread = new Thread(ReceiveMessage); myThread.Start(); private void ReceiveMessage() udpClient = new UdpClient(port); 4.2 广播消息发送广播消息主要代码:private void Form1_Load(object sender, EventArgs e) name = Dns.GetHostName(); Cursor.Current = Cursors.WaitCursor; Thread myThread = new Thread(ReceiveMessage); myThread.Start(); Thread.Sleep(1000); SendMessage(broderCastIP, login, + name); IPAddress ips = Dns.GetHostAddresses(name); IPAddress ip = ips1; txtIP.Text = ip.ToString(); txtHostName.Text = name; txtIP.ReadOnly = true; txtHostName.ReadOnly = true; Thread t = new Thread(lis); t.Start(); t.IsBackground = true; 4.3 文本消息的发送和接收文本消息的发送与接收是本系统用户使用的最基本的功能模块。文本消息的发送涉及到的内容有获取当前选中用户的ip地址以及其他信息,获取当前文本框中的内容并对其中的内容作简单的判断(是否为空,禁止发送空消息),将当前文本框中的内容复制到聊天记录文本框并清空当前文本框的内容等。发送的核心代码:private void button1_Click(object sender, EventArgs e) if (rtbSend.Text.Trim().Length 0) if (rdoPrivate.Checked) if (lvwUser.SelectedItems.Count = 0) MessageBox.Show(请选择一个用户); else string ip = lvwUser.SelectedItems0.SubItems2.Text.ToString(); string sendName = lvwUser.SelectedItems0.SubItems1.Text.ToString(); SendMessage(IPAddress.Parse(ip), message, + name + , + rtbSend.Text); rtbReceive.Text += + sendName + 发送(私聊): + rtbSend.Text + rn; rtbSend.Text = ; else SendMessage(broderCastIP, messageToall, + name + , + rtbSend.Text); rtbSend.Text = ; else MessageBox.Show(发送内容不能为空!); private void SendMessage(IPAddress ip, string str) UdpClient myClient = new UdpClient(); IPEndPoint iep = new IPEndPoint(ip, port); byte bytes = System.Text.Encoding.UTF8.GetBytes(str); try myClient.Send(bytes, bytes.Length, iep); catch (Exception ex) MessageBox.Show(ex.Message, 失败); finally myClient.Close(); 接收的核心代码:private void ReceiveMessage() udpClient = new UdpClient(port); udpClient.JoinMulticastGroup(broderCastIP); IPEndPoint remote = null; while (true) try byte bytes = udpClient.Receive(ref remote); String str = Encoding.UTF8.GetString(bytes, 0, bytes.Length); String splitString = str.Split(,); int s = splitString0.Length; string remoteName = splitString1; switch (splitString0) case login: setLvwUser(remoteName, remote.Address); if (remoteName != name) SendMessage(remote.Address, login2, + name); SetStatue(remoteName, on); break; case login2: setLvwUser(remoteName, remote.Address); SetStatue(remoteName, on); break; case message: setChatMessage(splitString2.ToString(), remoteName); break; case logout: RemoveLvwUser(remoteName); SetStatue(remoteName, out); break; case request: DialogResult r = MessageBox.Show(remoteName + 向您发送文件 + splitString2 + 确认接收吗?, , MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk); RemoteFileName = splitString2; if (r = DialogResult.OK) SendMessage(remote.Address, yes,); else SendMessage(remote.Address, no,); break; case yes: SendFile(remote.Address); break; case no: MessageBox.Show(对方拒绝接收文件!); break; case messageToall: setPublicMessage(splitString2.ToString(), remoteName); break; caseon: changeLvwUser(str); break ; catch (Exception ex) MessageBox.Show(ex.Message); break; 4.4 文件的发送和接收文件的发送和接收涉及到的内容比较多,由于使用TCP协议进行数据的发送与接收,能确保文件发送过程中不出现丢失的现象,所以不涉及超时问题。同时,由于文件的大小不一,所以文件的发送与接收是分块进行的,这同时也涉及到文件的读取和写入,文件块的大小等内容。文件传输过程中用到的核心类SendFile的定义如下:private void SendFile(IPAddress ip) ofd.InitialDirectory = D:; string path = txtSelectFile; filename = System.IO.Path.GetFileName(path); string fileep = Path.GetExtension(path); TcpClient client = new TcpClient(); client.Connect(ip, 9998); FileStream file = new FileStream(path, FileMode.Open,FileAccess.Read); BinaryReader binaryreader = new BinaryReader(file); byte b = new byte4096; int date; while (date = binaryreader.Read(b, 0, 4096) != 0) client.Client.Send(b, date, SocketFlags.None); client.Client.Shutdown(SocketShutdown.Both); binaryreader.Close(); file.Close(); MessageBox.Show(文件发送成功!); 文件发送的核心代码如下:private void btnSendFile_Click(object sender, EventArgs e) if (lvwUser.SelectedItems.Count = 0) MessageBox.Show(请选择一个用户通信!); else string ip = lvwUser.SelectedItems0.SubItems2.Text.ToString(); txtSelectFile = null; ofd = new OpenFileDialog(); if (ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK) txtSelectFile = ofd.FileName; filename = Path.GetFileName(txtSelectFile); SendMessage (IPAddress .Parse(ip),request,+name+,+filename ); txtFileName.Text = txtSelectFile.Split()txtSelectFile.Split().Length -1; txtFileWay.Text = txtSelectFile; 文件接收的核心代码如下:public void lis() while (true) string path = null; t1 = new TcpListener(9998); t1.Start(); ReSocket = t1.AcceptSocket(); sfd = new SaveFileDialog(); sfd.Filter = 文本文件|*.txt|C#文件|*.cs|word文件|*.doc|所有文件|*.*; sfd.FilterIndex = 4; sfd.RestoreDirectory = true; sfd.AddExtension = true; sfd.FileName = RemoteFileName; invokeThread = new Thread(new ThreadStart(InvokeMethod); invokeThread .SetApartmentState(ApartmentState.STA); invokeThread.Start(); invokeThread.Join(); if (result = System.Windows.Forms.DialogResult.OK) path = sfd.FileName; FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); BinaryWriter binarywrite = new BinaryWriter(fs); int count; byte b = new byte4096; while (count=ReSocket.Receive (b,4096,SocketFlags.None)!=0) binarywrite .Write (b,0,count); binarywrite .Close (); fs.Close (); ReSocket .Close (); Thread .Sleep (1000); t1.Stop(); MessageBox.Show (文件接收成功!); 4.5发送心跳包当用户上线后,会循环执行该模块,以5秒的间隔向所有用户发送心跳包来说明自己在线,其他用户收到心跳包后每隔5秒更新一次,更新时遍历自己的用户列表,与心跳包里的用户信息比较,找到该用户后将其生命值设置为3,若更新时没有发现来自某用户的心跳包,则将该用户生命值减1,当生命值为0时则判定该用户以外掉线,将该用户从用户列表中移除,此过程对用户是透明的,由程序自行完成。发送心跳包的核心代码如下:private delegate void schangeLvwUserDelegate(string m); private void changeLvwUser(string m) if (lvwUser.InvokeRequired) schangeLvwUserDelegate d = changeLvwUser; lvwUser.Invoke(d, m); else int i = 0; for (; i lvwUser.Items.Count; i+) if (lvwUser.Itemsi.SubItems2.Text.Trim() = m.Split(,)1) lvwUser.Itemsi.Tag = 1; break; if (i = lvwUser.Items.Count) setLvwUser(m.Split(,)2, IPAddress.Parse(m.Split(,)1); SetStatue(m.Split(,)2, on); private void timer1_Tick(object sender, EventArgs e) IPAddress ips = Dns.GetHostAddresses(name); I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 别墅大棚出租合同范本
- 合同撤诉解协议书模板
- 厂房电缆外包合同范本
- 卫生合作协议合同范本
- 协议解除装修合同模板
- 南通汽车租赁合同范本
- 协议书范本换房协议书
- 农超租赁合同独家协议
- 制作宣传材料合同范本
- 区域代理项目合同范本
- 2025年高中语文必修上册第二单元大单元教学设计
- (2025年)建筑起重信号司索工考试题库(附答案)
- 通信管道施工安全培训课件
- 2025年长春市团校入团考试题库及参考答案详解
- 消防联动调试方案(完整版)
- 收费站廉政培训课件
- 酒店数字化运营知识培训课件
- 2025至2030中国健康管理行业发展形势及投资规划预测报告
- 终末病历质控工作规范与案例
- 四川省石渠县2025年上半年公开招聘辅警试题含答案分析
- 合同签订与履行法律风险防范
评论
0/150
提交评论