




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于TCP协议的点对点聊天程序计算机网络原理实验报告基于TCP协议的点对点聊天程序 作者: 班级: 学号: 导师: 目录1、 设计目标32、 Visual Basic Winsock控件简单介绍33、 Visual Basic Winsock控件的导入 34、 程序设计的主要步骤.5 4.1网络通信协议的基础和选择 54.2 客户端与服务器的实现过程.64.3 程序的编写.84.4可执行文件的生成.145、测试.156、总结.18 6.1 关键问题.18 6.2 本程序的不足.18 6.3 心得体会.181、 设计目标本实验的目标是用Visual Basic语言设计一个基于TCP/IP协议的点对点的聊天程序。 利用Visual Basic Winsock控件实现。程序写完后最终生成服务器和客户端两个可执行文件,打开服务器可执行文件,即运行服务器,然后客户端可以不局域网上不同的主机上运行,输入服务器主机的IP,连接到服务器,客户端与客户端之间即可实现简易的聊天功能,在服务器可以显示在线人数以及客户端的IP地址。2、 Visual Basic Winsock控件简单介绍本实验用到Visual Basic中一个比较新的控件,就是Winsock控件。它主要用于将Winsock接口简化成易于使用的Visual Basic内部接口。在这种控件问世之前,要想通过Visual Basic 进行网络程序设计,唯一的办法便是将所有Winsock函数都从DLL中导入(Import),然后重新定义必要的结构。但是这样的话,结构的数量就是很多,工作量也太大,且极易出错。Winsock控件问世之前,用Visual Basic进行网络编程就变得非常方便了。Winsock控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。3、Visual Basic Winsock控件的导入在打开Visual Basic 软件时,在工具箱中并没有Winsock 控件,要使用它,首先要将这个控件引用进来,如下图操件:(注意可能在部件中没有该控件,解决办法请阅读“使用必读.txt”)点击“工程”部件,弹出对话框,选择Microsoft Winsock Control 6.0 。(注意可能在部件中没有该控件供选择,解决办法请阅读“使用必读.txt”)选择完成后这时在Visual Basic的编辑画面左这的工具箱中会多一个控件,这就是Winsock控件,现在就可以开始使用它进行设计编程。4、 程序设计的主要步骤4.1网络通信协议的基础和选择 a、TCP(数据传输协议)基础数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。b、 UDP(用户数据文报协议)基础用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连接。另外 UDP 应用程序可以是客户机,也可以是服务器。为了传输数据,首先要设置客户计算机的 LocalPort 属性。然后,服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址,并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。于是,客户计算机使用 DataArrival 事件内的 GetData 方法来获取已发送的信息。c、 选择通讯协议在使用 WinSock 控件时,首先需要选择使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:TCP 协议是有连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。通讯协议的选择是通过设置WinSock的Protocol属性来实现的。在这里我选择的是使用TCP通讯协议编写聊天程序,通过编写程序:Winsock1(0).Protocol = sckTCPProtocol,即可以选择TCP协议。也可以通过属性窗口进行选择,如下图4.2 客户端与服务器的实现过程客户端:a、设置远程服务器主机端口Winsock1.RemotePort = 1600 b、设置远程服务器主机IP地址 Winsock1.RemoteHost = Trim(Text4.Text)在文本框Text4中输入服务器的IP地址。 c、与服务器主机连接,发生错误则关闭Winsock1.Connect d、发送与接收数据 在事件Winsock1_DataArrival中编写如下代码, Winsock1.SendData Text1.Text 要发送的话在文本框Text1中输入 Winsock1.GetData c, vbString 接收数据,将接收到的数据存放在变量c中YesNoYesNo e、关闭连接 Winsock1.CloseSendData GetData开始 其流程图如右所示: 断开连接?远程主机IP与端口设置CloseConnect结束Error?服务器端:a、设置服务器本地端口Winsock1(0).LocalPort = 1600 b、监听客户端的连接请求Winsock1(0).Listen c、当有连接到达时,接受请求 在事件Winsock1_ConnectionRequest(中编写如下代码, Winsock1(Socknumber).Accept requested d、发送与接收数据 在事件Winsock1_DataArrival中编写如下代码, Winsock1(Index).GetData c, vbString 获取数据Winsock1(i).SendData c 发送数据 e、关闭连接 Winsock1.Close其流程图如下所示:开始本地端口设置ListenError ?YesNoGetData , SendData没有断开则继续CloseClose结束4.3 程序的编写客户端的程序编写:1. 在客户端创建一个新的工程将其命名为“客户”。2. 将缺省窗体命名为 “客户”。3. 将窗体的标题改为“客户端。4. 在窗体中添加一个 WinSock 控件,默认其命名为 Winsock1。5. 在窗体中添加四个TextBox 控件。默认其命名为Text1、Text2、Text3、Text4,并将其内容清空。6. 在窗体中添加四个CommandButton控件。其命名默认为 Command1、Command2、Command3、Command4,并将它们的Caption属性分别修改为“连接”、“发送”、“断开”、“清空聊天记录”。7. 在窗体上放四个Label 控件,其命名默认为Label1、Label2、Label3、Label4,并将它们的Caption属性修改为“发送”、“聊天记录”、“系统消息”、“服务器IP”。8. 在窗体上放一个StatusBar控件,其命名默认为StatusBar1其属性设置如下图所示:9.打开菜单编辑器,为窗体添加菜单,设置如下图所示:10. 在窗体中添加如下的代码。 Option ExplicitPrivate Sub Command1_Click() 连接服务器程序段 Winsock1.RemoteHost = Trim(Text4.Text) Winsock1.Connect Command1.Enabled = False Do DoEvents Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError If Winsock1.State = sckError Then Command1.Enabled = True Winsock1.Close Text3.Text = Text3.Text + 与服务器连接失败 + Chr$(13) + Chr$(10) Else Text3.Text = Text3.Text + 与服务器连接成功 + Chr$(13) + Chr$(10) Command2.Enabled = True Command3.Enabled = True Text4.Enabled = False Text1.SetFocus StatusBar1.Panels(1).Text = Connected to & Winsock1.RemoteHost & End IfEnd SubPrivate Sub Command2_Click() 发送消息程序段If Text1.Text = ThenMsgBox 不能发送空消息Else Winsock1.SendData Text1.Text Text2.Text = Text2.Text + 我说的话: + Text1.Text + Chr$(13) + Chr$(10) Text1.Text = End IfText1.SetFocusEnd SubPrivate Sub Command3_Click() 断开与服务器连接程序段 Winsock1.Close Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Text3.Text = 已与服务器断开 + Chr$(13) + Chr$(10) + Text3.Text Text4.Enabled = True StatusBar1.Panels(1).Text = No connection. End SubPrivate Sub Command4_Click() 清空聊天记录程序段Text2.Text = Text1.SetFocusEnd SubPrivate Sub exitbutton_Click() 点击File-exit,退出聊天EndEnd SubPrivate Sub Form_Load() 运行时最初显示的属性以及提示 Winsock1.RemoteHost = 92 Show MsgBox Visual Basic Winsock Chat & vbCrLf & by chendf & vbCrLf & vbCrLf & Press Button确定 , then Press Menu Help for help., vbInformation Winsock1.RemotePort = 1600 Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False End SubPrivate Sub helpbutton_Click() 点击Help,弹出帮助文本ChDir App.PathShell notepad.exe 使用必读.txt, vbNormalFocus 调用外部程序notepad.exe来打开帮助文本文件End SubPrivate Sub Winsock1_Close() 关闭winsock Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Winsock1.Close Text3.Text = 已与服务器断开 + Chr$(13) + Chr$(10) + Text3.TextEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 数据到达 Dim c As String Winsock1.GetData c, vbString Text2.Text = Text2.Text + 对方说的话: + c + Chr$(13) + Chr$(10)End Sub服务器端的程序编写:1. 在服务器端创建一个新的工程将其命名为“服务器”。2. 将缺省窗体命名为“服务器”。3. 在窗体中添加一个ListBox控件,将其命名为“ListBox”。4. 在窗体中添加一个WinSock控件,其名默认为Winsock1,并将其属性“Index”属性设置为0,如下图:设置完以后,Winsock1会变成Winsock1(0)。5在窗体上添加一个TextBox控件,其名默认为Text3,将其初值设置为0。6. 在窗体上添加两个Label控件,其名默认为Label1、Label2,并将它们的Caption属性改为“在线人数”、“客户端IP列表”。7.打开菜单编辑器,为窗体添加菜单file。8. 在窗体中添加如下代码.。Private Gac() As BooleanDim Socknumber As Integer 定义变量Private Sub exitbutton_Click() 点击file-exit,退出系统EndEnd SubPrivate Sub Form_Load() 开始运行时显示窗口的属性以及执行的操作 Winsock1(0).LocalPort = 1600 Winsock1(0).Protocol = sckTCPProtocol Me.Caption = 服务器 & - & Winsock1(0).LocalIP & : & Winsock1(0).LocalPort Winsock1(0).Listen Socknumber = 0End SubPrivate Sub Form_Unload(Cancel As Integer) unload时关闭winsock Winsock1(0).CloseEnd SubPrivate Sub Winsock1_Close(Index As Integer) 关闭winsock Winsock1(Index).Close Unload Winsock1(Index) Gac(Index) = False Text3.Text = Int(Text3.Text) - 1End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) Dim ip As String Socknumber = Socknumber + 1 连接请求 Load Winsock1(Socknumber) Winsock1(Socknumber).Accept requestID ReDim Preserve Gac(Socknumber) Gac(Socknumber) = True Text3.Text = Int(Text3.Text) + 1 ip = Winsock1(Index).RemoteHostIP ListIp.AddItem ipEnd SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim c As String 数据到达 Winsock1(Index).GetData c, vbString Dim i As Integer For i = 1 To UBound(Gac) If
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全托管加盟合同样本
- 住房防水协议合同样本
- 保安劳务合同样本封面
- 代理外包协议合同样本
- 三天自动解约合同范例
- 个人简易入股合同样本
- pvc订购合同样本
- 雨棚成品购买合同范本
- 信息科技合同标准文本
- 临街店铺转让合同标准文本
- 医院保安服务方案投标文件(技术方案)
- 外研版高中英语新教材必修三Unit1随身课本-Understandingideas01
- 口袋妖怪白金详细图文攻略(整理全)
- GB/T 9575-2013橡胶和塑料软管软管规格和最大最小内径及切割长度公差
- GB/T 6495.2-1996光伏器件第2部分:标准太阳电池的要求
- 2023年全国高考英语试题和答案(辽宁卷)
- 【精品】六年级下册语文试题-阅读理解专项训练5含答案全国通用
- 详解2021年《关于优化生育政策促进人口长期均衡发展的决定》ppt
- 保护继电器中文手册-re610系列rem610tobcnb
- 焊接接头表面质量检查记录
- 空调机房吸音墙顶面综合施工专题方案
评论
0/150
提交评论