用VBNet语言设计基于UDP和TCP协议的聊天软件_第1页
用VBNet语言设计基于UDP和TCP协议的聊天软件_第2页
用VBNet语言设计基于UDP和TCP协议的聊天软件_第3页
用VBNet语言设计基于UDP和TCP协议的聊天软件_第4页
用VBNet语言设计基于UDP和TCP协议的聊天软件_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGEII《计算机网络》课程设计报告课题名称:用VB.Net语言设计基于UDP和TCP协议的聊天软件院系:_____专业:班级:________学生姓名:________学号:__指导教师:开课时间:学年学期摘要随着移动互联网时代的到来,网络编程越来越显示其重要性。网络与我们的生活息息相关。本次课程设计从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术,利用VisualBasic语言编程实现基于udp和tcp的网络聊天工具。在任务一中,WinSock控件设计一个基于UDP协议的通讯程序。要实现计算机点对点的连接下的接收、发送字符串。当你运行你的服务器,然后在其它电脑上运行客户端,输入服务器主机的IP和端口号,客户端与服务器之间即可实现简易的通讯功能。在任务二中,WinSock控件设计一个基于TCP协议的通讯程序。整个程序包括服务器和客户端两个部分。要实现多台计算机连接情况下的接收、发送字符串,就是指多台客户端连接到同一个服务器,以服务器为中端来进行通讯。当你运行服务器,然后在其它电脑上运行客户端,输入服务器主机的IP和端口号,连接到服务器,客户端与客户端之间即可实现简易的通讯功能。关键词:winsock网络通信文本聊天C/S体系

目录摘要 1目录 21.引言 32.UDP聊天软件 42.1.课程设计的课题 42.2.课程设计工作进程 52.3.VbWinsock控件及UDP协议介绍 52.4.VisualBasicWinsock的控件导入 52.5.程序设计步骤 62.5.1UDP通信议协的基础 62.5.2客户端与服务器的实现过程 72.5.3程序的编写 72.5.4生成可执行文件 92.6.结果测试 102.7.遇到的问题及解决方案 122.7.1遇到的问题 122.7.2解决方案 123.TCP聊天软件 133.1模版软件的实现 133.1.1TCP通信协议的基础 133.1.2客户端与服务器的实现过程 133.2模版软件的程序编写 153.2.1程序的编写 153.2.2生成可执行文件 173.3模版软件的结果和测试 183.4模版软件的改进 193.4.1遇到的问题 193.4.2解决方案 194.总结 20参考文献 21致谢 21

1.引言Internet的出现改变了人们的生活,也成为了现代社会的最显著的标志。VB6.0中的Winsock控件正是当前Internet软件开发的主要工具之一,本文将通过一个网络聊天程序的制作与您共同探讨该控件在Internet网络应用程序开发中的技术。制作网络聊天的关键是了解Winsock控件,在VB6.0中该控件以部件的形式将WinsockAPIs形象地呈现给程序员,Winsock控件提供了访问TCP和UDP网络服务的方便途径,程序员可以使用它很方便地完成网络应用程序的开发,而不必了解网络协议的细节或调用低级的WinsockAPIs,只需通过设置控件的属性并调用其方法就可方便地连接到一台远程机器上去,且还可双向交换数据。当我们做到这一点时,基于Internet网络的应用程序也就完成了。2.UDP聊天软件2.1.课程设计的课题1、利用WinSock控件编写基于UDP,TCP协议的应用程序,要求如下:a、使用UDP,TCP协议,包含服务器和客户端b、可以实现多台计算机进行点对点连接情况下的接收、发送字符串c、设计一个UDP,一个TCP聊天软件,如下图2.2.课程设计工作进程2012.11.19-2012.11.21查阅资料,构思设计方案2012.11.22-2012.11.24单元功能模块设计2012.11.25-2012.11.27总体系统流程图,编写设计说明书2012.11.28-2012.11.29编写论文2.3.VbWinsock控件及UDP协议介绍1.Winsck控件的主要属性属性名说明BytesReceived返回接收的数据,可以用GetData方法来获取它LocalHostName返回本机名LocalIP返回本机IPLocalPort返回或设置本机所用的端口,如果为0则为随机产生Protocol返回通信所用的协议RemoteHostName返回通信对方的计算机名RemoteHostIP返回通信对方的IPState返回Winscok的当前状态,取值如下sckClosed(常量为0):关闭状态sckOpen(常量为1):打开状态sckListening(常量为2):侦听状态sckConnectionPending(常量为3):连接状态sckResolvingHost(常量为4):解析主机中sckHostResolved(常量为5):已解析主机sckConnecting(常量为6):正在连接sckConnected(常量为7):已经连接sckClosing(常量为8):客户端正在关闭sckError(常量为9):连接发生错误2.Winsock的主要方法:方法名作用listen使服务器程序处于侦听状态,等待客户端的连接请求connect用于客户端向远程发送一个连接请求,语法:Winsock.connect[IP,Port]Accept用于服务器接收一个远程客户端的连接请求,语法:Winsock.AcceptrequestIDsendData用于向远程发送数据,语法:Winsock.sendData数据getData用于接收远程发送来的数据,语法:Winsock.getData变量Close关闭通信3.Winsock的主要事件:事件名说明Connect当服务器接收客户端请求时,服务端发生的事件DataArrival有数据到达时发生的事件,可以在这个事件中来getData发送来的数据ConnectionRequest客户端用Connect方法时服务器发生的事件,可以在这个事件中来Accept一个连接请求SendProgress发送数据中发生的事件,可以在这个事件中来标示当前已经发送多少数据SendComplete发送数据完成发生的事件Error通信发生错误时发生的事件Close关闭通信时发生的事件UDP协议有两个特性:1.UDP是一个面向无连接的协议,2:一台服务器可以同时向多个用户传输相同的数据。2.4.VisualBasicWinsock的控件导入在打开VisualBasic软件时,在工具箱中并没有Winsock控件,要使用它,首先要将这个控件引用进来。方法如下:在VB里点击菜单【工程】—【部件】在弹出的部件窗体里找到“MicrosoftWinsockControl6.0(SP6)”,选中,再点【确定】,然后Winsock控件就添加到vb左侧的工具栏里了。选择完成后这时在VisualBasic的编辑画面左这的工具箱中会多一个控件,这就是Winsock控件,现在就可以开始使用它进行设计编程。

选择完成后这时在VisualBasic的编辑画面左这的工具箱中会多一个控件,这就是Winsock控件,就可以直接放到窗口进行使用。2.5.程序设计步骤2.5.1UDP通信议协的基础用户数据文报协议(UDP)是一个无连接协议。跟TCP的操作不同,计算机并不建立连接。另外UDP应用程序可以是客户机,也可以是服务器。为了传输数据,首先要设置客户计算机的LocalPort属性。然后,服务器计算机只需将RemoteHost设置为客户计算机的Internet地址,并将RemotePort属性设置为跟客户计算机的LocalPort属性相同的端口,并调用SendData方法来着手发送信息。于是,客户计算机使用DataArrival事件内的GetData方法来获取已发送的信息。

建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用SendData方法。当接收数据时会发生DataArrival事件。调用DataArrival事件内的GetData方法就可获取数据。通讯协议的选择是通过设置WinSock的Protocol属性来实现的。2.5.2客户端与服务器的实现过程服务器端(OR客户端):a、设置服务器本地端口UDPSOCKET.LocalPort=29'该Winsock控制将要使用的本地端口号,便于其它端与该Winsock通讯UDPSOCKET.BindUDPSOCKET.LocalPort'将该Winsock控制绑定到该本地端口b、设置要连接到的计算机名UDPSOCKET.RemoteHost=txtIP.Text'要连接到的计算机名c、设置要连接到的端口UDPSOCKET.RemotePort=Dk.Text'要连接到的端口号d、当有连接到达时,接收数据在事件UDPSOCKET_DataArrival中编写如下代码:UDPSOCKET.GetDatastrData,vbStringtxtReceive.Text=txtReceive.Text&UDPSOCKET.RemoteHostIP&"对方说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text&""&strData&Chr(13)&Chr(10)其发送/接受流程图如下:输入对方IP和输入对方IP和端口号聊天(发送、接受信息)结束2.5.3程序的编写服务器端的程序编写:

1、在服务器端创建一个新的工程将其命名为"server."。2、在窗体中添加二个Label控件,将将它们的"Caption"属性值改为为"对方的IP:""端口"。

3、在窗体中添加四个textbox控件,将其分别命名为"txtIP""txtReceive""txtSend""Dk"。4、在控件"txtReceive"属性中设置,"Locked"及"MultLine"属性值为True,"ScrollBars"属性值为1-Horizontal,2-Vertical或者Both5、在窗体中添加一个WinSock控件,其名设置为UDPSOCKET,并将其属性Protocol"属性设置为1-sckUDPProtocol。6、在窗体上添加一个ComboBox控件,其名分别为"Combo1"7、在窗体上添加两个CommandButton控件,其名默认为Command1,Command2将其Caption属性改为“发送”及“聊天记录”。8、在窗体中添加如下代码:PrivateSubCommand1_Click()IftxtIP.Text=""ThenMsgBox"请输入IP地址!",vbInformation,"提示"ElseIfCombo1.Text<>""ThentxtSend.Text=Combo1.TextEndIfIftxtSend.Text<>""ThenUDPSOCKET.SendData(txtSend.Text)'发送文本txtReceive.Text=txtReceive.Text&UDPSOCKET.LocalIP&"说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text&""&txtSend.Text&Chr(13)&Chr(10)txtSend.Text=""EndIfEndIfEndSubPrivateSubDk_Change()UDPSOCKET.RemotePort=Dk.TextEndSubPrivateSubForm_Load()'UDPSOCKET.RemotePort=Dk.Text'要连接到的端口号UDPSOCKET.LocalPort=29'该Winsock控制将要使用的本地端口号,便于其它端与该Winsock通讯UDPSOCKET.BindUDPSOCKET.LocalPort'将该Winsock控制绑定到该本地端口Combo1.AddItem"我很忙!"Combo1.AddItem"我真的很忙!"Combo1.AddItem"我真的真的很忙!"Combo1.AddItem"。。。!"EndSubPrivateSubtxtIP_Change()UDPSOCKET.RemoteHost=txtIP.Text'要连接到的计算机名EndSubPrivateSubtxtReceive_Change()EndSubPrivateSubUDPSOCKET_DataArrival(ByValbytesTotalAsLong)DimstrDataAsStringUDPSOCKET.GetDatastrData,vbStringtxtReceive.Text=txtReceive.Text&UDPSOCKET.RemoteHostIP&"对方说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text&""&strData&Chr(13)&Chr(10)EndSub2.5.4生成可执行文件点击“文件”—“server.exe”即可生成服务器端的可执行文件,如下图所示:(client.exe的生成方法相同) 2.6.结果测试a、双击“server.exe”,运行软件b、对方的IP中输入服务器IP地址:0c、可以开始聊天,在发送文本框中输入需要发送的消息,并点击发送按钮,将消息发送出去。2.7.遇到的问题及解决方案2.7.1遇到的问题服务器与客户端之间进行通讯时,由于端口代码问题,无法进行通讯,部分只可进行单向通信。若服务器端口为50,客户端端口为100,同时设置服务器要连接的端口为99,客户端要连接的端口为50。服务器无法发送信息到客户端;若客户端先发送信息到服务器,之后服务器竟然也能对客户端进行通讯。发送出去的消息在txtReceive框中显示在一行中无法进行自动换行,而且无滚动条来阅览上面聊天的内容。每次连接新的服务器都需要重新输入端口号。无快捷回复按钮,进行快速回复。背景过于单调无聊天记录2.7.2解决方案1、UDPSOCKET.RemotePort设置为你所需要连接到的端口,UDPSOCKET.LocalPort设置为本地端口号,UDPSOCKET.Bind(绑定)到该本地端口,方便于其它端与该Winsock通讯。2、由于客户端发送信息给服务器后,服务器的路由表发生改变,能够识别客户端的端口号,所以在客户端发送消息给服务器后,服务器能够回复客户端。3、我们只需要在控件"txtReceive"属性中设置,"Locked"及"MultLine"属性值为True,"ScrollBars"属性值为1-Horizontal,2-Vertical或者Both,就可以实现。我们添加了一个"DK"按钮,以便输入需要连接的服务器的端口,这样不用每次连接新的服务器的时候在修改代码,并加入以下代码:PrivateSubDk_Change()UDPSOCKET.RemotePort=Dk.Text5、我们在窗体上添加一个ComboBox控件,并在Form_Load()中添加如下代码:Combo1.AddItem"我很忙!"Combo1.AddItem"我真的很忙!"Combo1.AddItem"我真的真的很忙!"Combo1.AddItem"。。。!""AddItem"函数来添加快捷回复内容6、可以在程序属性选项中的BackColor或者Picture中加入背景颜色或者背景图片。7、由于代码问题,暂时无法实现3.TCP聊天软件3.1.模版软件的实现3.1.1TCP通信协议的基础TCP数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。

如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(RemoteHost属性),还要知道进行“侦听”的端口(RemotePort属性),然后调用Connect方法。

如果创建服务器应用程序,就应设置一个收听端口(LocalPort属性)并调用Listen方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。

建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用SendData方法。当接收数据时会发生DataArrival事件。调用DataArrival事件内的GetData方法就可获取数据。通讯协议的选择是通过设置WinSock的Protocol属性来实现的。3.1.2客户端与服务器的实现过程1)服务器端:a、读取服务器的IP地址textserverIP.Text=Winsock1.LocalIPb、设置服务器本地端口Winsock1(0).LocalPort=10001c、监听客户端的连接请求Winsock1(0).Listend、当有连接到达时,接受请求在事件Winsock2_ConnectionRequest中编写如下代码:IfWinsock2.State<>sckClosedThenWinsock2.CloseWinsock2.AcceptrequestIDe、发送与接收数据在事件Winsock2_DataArrival中编写如下代码:DimgetDataStrAsStringWinsock2.GetDatagetDataStr,vbString,bytesTotalList1.AddItemgetDataStrtxtReceive.Text=txtReceive.Text&Winsock1.RemoteHostIP&""&"说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text&""&getDataStr&Chr(13)&Chr(10)f、关闭连接Winsock2.Close其流程图如下所示:YESYESNOClose结束GetData,SendDataError?Listen本地端口设置开始2)客户端:a、设置远程服务器主机端口Winsock1.RemotePort=10001b、设置远程服务器主机IP地址Winsock1.RemoteHost=Trim(textserverIP.Text)在文本框textserverIP中输入服务器的IP地址。c、与服务器主机连接,发生错误则关闭Winsock1.Connectd、发送与接收数据在事件Winsock1_DataArrival中编写如下代码,Winsock1.SendDatatextsend.Text‘要发送的话在文本框textsend中输入Winsock1.GetDatac ‘接收数据,将接收到的数据存放在变量c中e、关闭连接Winsock1.Close其流程图如下所示:YESYESNOError?Connect远程主机IP与端口设置开始断开连接?SendDataGetDataClose结束3.2.模版软件的程序编写3.2.1程序的编写 1、在服务器端创建一个新的工程将其命名为"server"。

2、在窗体中添加二个Frame控件,并将Caption属性值设为:"客户端"及"服务器端"。3、在窗体中添加二个WinSock控件,其名默认为"Winsock1"及"Winsock2"。并将其属性Protoco属性设置为1-sckTCPProtocol。4、在窗体中添加五个Label控件,将它们的Caption属性值改为为"服务器的IP地址:""服务器端口号:""倾听的端口号:""发送信息的内容:""收到的信息内容:"。5、在窗体中添加六个textbox控件,将其分别命名为"Text1""Text2""Text3""Text4""txtReceive"。6、在控件"txtReceive"属性中设置,"Locked"及"MultLine"属性值为True,"ScrollBars"属性值为1-Horizontal,2-Vertical或者Both。7、在窗体上添加五个CommandButton控件,将其Caption属性改为"连接服务器""发送消息""断开服务器""开始服务""停止服务"。8、在窗体中添加如下的代码:PrivateSubCommand1_Click()Command1.Enabled=FalseCommand3.Enabled=TrueCommand2.Enabled=TrueWinsock1.LocalPort=30Winsock1.RemoteHost=Text1.TextWinsock1.RemotePort=CInt(Text2.Text)Winsock1.ConnectEndSubPrivateSubCommand2_Click()IfWinsock1.State=sckConnectedThenWinsock1.SendDataText3.TextEndIfIfText3.Text<>""ThenWinsock1.SendData(Text3.Text)'发送文本txtReceive.Text=txtReceive.Text&Winsock1.LocalIP&"说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text&""&Text3.Text&Chr(13)&Chr(10)Text3.Text=""EndIfEndSubPrivateSubCommand3_Click()Command3.Enabled=FalseCommand2.Enabled=FalseCommand1.Enabled=TrueWinsock1.CloseEndSubPrivateSubCommand4_Click()Winsock2.LocalPort=CInt(Text4.Text)Winsock2.ListenCommand4.Enabled=FalseCommand5.Enabled=TrueCommand1.Enabled=TrueEndSubPrivateSubCommand5_Click()Command5.Enabled=FalseCommand4.Enabled=TrueCommand1.Enabled=TrueWinsock2.CloseEndSubPrivateSubForm_Load()Command5.Enabled=FalseCommand3.Enabled=FalseCommand2.Enabled=FalseCommand1.Enabled=FalseEndSubPrivateSubFrame1_DragDrop(SourceAsControl,XAsSingle,YAsSingle)EndSubPrivateSubtxtReceive_Change()EndSubPrivateSubWinsock2_ConnectionRequest(ByValrequestIDAsLong)IfWinsock2.State<>sckClosedThenWinsock2.CloseWinsock2.AcceptrequestIDEndSubPrivateSubWinsock2_DataArrival(ByValbytesTotalAsLong)DimgetDataStrAsStringWinsock2.GetDatagetDataStr,vbString,bytesTotalList1.AddItemgetDataStrtxtReceive.Text=txtReceive.Text&Winsock1.RemoteHostIP&""&"说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text&""&getDataStr&Chr(13)&Chr(10)EndSub3.2.2生成可执行文件点击“文件”—“server.exe”即可生成服务器端的可执行文件,如下图所示:(client.exe的生成方法相同)3.3.模版软件的结果和测试1、在服务器端输入自己的端口号,客户端输入你想连接的服务器的ip和该服务器的端口号。点击开始服务后,连接服务器,即可开始对话:3、点击断开服务器后再次连接服务器,输入新的发送内容,无法再次发送。3.4.模版软件的改进3.4.1遇到的问题1、软件五个按钮开关后,无法正确置灰。2、客户端无法显示双方收发的信息记录。3.4.2解决方案1、对于这个问题,设置了Command1.Enabled=FalseorTrue,当赋值为False时,将按钮置灰。我们添加了一个"txtReceive"控件,以便显示双方收发的信息记录,并(1):在事件Winsock2_DataArrival中加入以下代码:txtReceive.Text=txtReceive.Text&Winsock1.RemoteHostIP&""&"说:"&Time&vbCrLf&""&Chr(13)&Chr(10)txtReceive.Text=txtReceive.Text

温馨提示

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

评论

0/150

提交评论