《网络编程技术》课程设计报告课程设计题目:局域网点对点通信软件与实现作者所在系部:计算机科学与工程系作者所在专业:网络工程作者所在班级:作者姓名:作者学号:指导教师姓名:完成时间: 2013年07月10日课程设计任务书摘要所谓网络中的点对点通信是实现网络上不同计算机之间,不经过任何中继设备而直接交换数据或服务的一种技术。
由于允许网络中任何一台计算机可以直接连到网络中的其他计算机,并与之进行数据交换,这样既可以消除中间环节,也使得网络上的沟通变的更加容易、更加直接。
本文介绍的是一种是用Winsock编程技术,基于TCP/IP协议的、面向连接的流式套接字网络通信编程设计。
局域网即时通讯软件使用TCP协议作为传输层的协议,采用点对点模式服务,不需要服务器支持,使局域网用户的使用更加方便和高效。
它可以实现局域网用户的自动检测,用户间文本信息的交流,文件的传输等功能。
本系统使用Visual Studio 2010作为开发工具,将.NET中的一些技术运用到系统中关键词:点对点;TCP/IP;Socket;UDP;P2P目录摘要 (2)目录 (3)第1章绪论 (4)1.1课题研究现状分析 (4)1.2选题的目的及意义 (4)第2章系统需求分析 (5)2.1 问题的提出 (5)2.2 系统的设计目标 (5)第3章系统总体设计 (6)3.1系统功能设计 (6)3.2功能模块的说明 (7)3.2.1初始化(广播用户信息) (7)3.2.2用户列表管理 (7)3.2.3文本信息传输 (7)3.2.4文件传输 (7)3.2.5发送心跳包 (7)第4章系统实现 (8)4.1初始化模块的设计和实现 (8)4.1.1监听端口 (8)4.2 广播消息 (8)4.3 文本消息的发送和接收 (9)4.4 文件的发送和接收 (12)4.5发送心跳包 (14)第5章课程设计总结 (16)5.1 主要问题及解决办法 (16)5.2 课程设计体会 (16)5.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)客户端定期发送心跳包,表示本客户端的存在。
第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 数据报则支持向局域网内的所有用户发送组播消息,即向ip224.100.0.1发送消息,局域网内所有监听相同端口的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 = ips[1];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.SelectedItems[0].SubItems[2].Text.ToString();string sendName = lvwUser.SelectedItems[0].SubItems[1].Text.ToString();SendMessage(IPAddress.Parse(ip), "message," + name + "," + rtbSend.Text); rtbReceive.Text += "[" + sendName + "]发送(私聊):" + rtbSend.Text + "\r\n"; 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 = splitString[0].Length;string remoteName = splitString[1];switch (splitString[0]){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(splitString[2].ToString(), remoteName);break;case"logout":RemoveLvwUser(remoteName);SetStatue(remoteName, "out");break;case"request":DialogResult r = MessageBox.Show(remoteName + "向您发送文件" + splitString[2] + "确认接收吗?", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk); RemoteFileName = splitString[2];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(splitString[2].ToString(), remoteName);break;case"on":changeLvwUser(str);break ;}}catch (Exception ex){MessageBox.Show(ex.Message);break;}}}4.4 文件的发送和接收文件的发送和接收涉及到的内容比较多,由于使用TCP协议进行数据的发送与接收,能确保文件发送过程中不出现丢失的现象,所以不涉及超时问题。