【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“用VB设计网络聊天室 【精编】 - 医学卫生“提供大家参考,希望对大家有所帮助!
1 用
VB设计网络聊天室 第1章 课程设计的目的 1.加深对计算机网络通信系统的工作原理的理解 通过编写计算机程序模拟网络通信的某些功能理解并掌握网络
通信系统的基本工作原理及
工作过程。
2.提高网络应用的能力 学会运用网络语言以及
网络协议设计小型网络。
能对小型的网络应用系统进行分析并能提出建网解决
方案。
第2章
课程设计分析及要求 2.1 网络协议 Internet 上的通讯协议是TCP/IPInternet 上数据传输协议主要有TCP 和UDPTCP 是有连接协议它要求计算机进行对话时必须先建立连接保证数据传送安全到达目的地。
UDP 是无连接协议它只是将信息送到网络上并不检查数据是否到达了目的地。
要进行实时会话则应该采用TCP 协议。
本程序采用的协议就是TCP 协议。
2.2 程序组成及简单原理介绍 程序分为服务器端和客户端两部分。
由于本应用程序使用TCP协议因此决定应用程序是服务器端程序。
那么应用程序需要监听指定的端口。
客户端程序启动后首先与服务器建立连接连接成功后输入对方IP地址即可进入聊天室服务器端程序则负责维护与每一个客户的连接和数据交换并且记录下所有聊天内容及人员名单。
如果服务器程序关闭则所有客户程序自动关闭。
2.3 Winsock通信过程 1.Winsock 控件 要实现两台计算机的对话可以通过Winsock 控件进行。
而不需了解更多的数据传输细节本程序就是通过Winsock 进行的。
Winsock 有多种属性、方法和事件本文只列举出要使用的属性、方法和事件。
BytesReceived 属性返回接收到的当前在接收端缓冲区内数据的数量。
使用GetData方法来获得数据。
LocalHostName属性返回本地计算机名。
在设计时是只读的而且是不可用的。
LocalIP属性返回本地机器的IP地址。
在设计时是只读的而且是不可用的。
LocalPort属性返回或者设置所用到的本地端口。
RemoteHostIP属性返回远程机器的IP地址. Protocal属性返回或设置WinSock控件所使用的协议——TCP或UDP。
State属性返回控件的状态用枚举型表示。
在设计时是只读的而且是不可用的。
SocketHandle属性返回一个与套接字句柄对应的值控件用套接字句柄同WinSock层通信。
在
设计时是只读的而且是不可用的。
Accept方法仅适应于TCP服务器应用程序。
在处理ConnectionRequest时使用这个方法接受新连接。
Bind方法指定用于TCP连接的LocalPort和LocalIP。
如果有多协议适配卡就用这个方法。
Close方法对客户机和服务器应用程序关闭TCP连接或侦听套接字。
Listen方法创建套接字并将其设置为侦听模式。
仅适应于TCP连接。
2 PeekData方法不从输入队列删除数据除次之外与GetData相似。
该方法仅适用于TCP连接。
SendData方法将数据发送给远程计算机。
Close事件当远程计算机关闭连接时出现。
应用程序应正确使用Close方法关闭TCP连接。
ConnevtionRequest事件当远程
计算机请求连接时出现。
DataArrival事件当新数据到达时出现。
SendComplete事件在完成一个发送操作时出现。
Error事件无论何时只要后台处理中出现错误事件就会出现。
Connect事件当一个Connect操作完成时发生。
2.聊天室程序应该包括一个服务器程序和若干个客户端进程设计时应分别设计客户端程序和服务器端程序。
首先设计一个客户端应用程序窗口及其包括的控件如图所示各控件属性如表所示。
在此之前应首先在Projict/Components页面中选择Microsoft Windows CommonControls 6.0和Microsoft Winsock Control 6.0两项 控件 属性 属性值 Form1 Caption 服务器端 Label1 Caption 待发送数据 Label2 Caption 已接受数据 cmdConnect Caption 连接 cmdSendData Caption 发送 cmdExit Caption 退出 sbWinsockState Width 4600 sktTCPChatClient Rrotocal 0-sckTCPRrotocal sktTCPChatClient RemotePort 1001 3.设计一个服务器应用程序窗口及其包括的控件如图所示各控件属性如表所示。
其他设置同客户端。
控件 属性 属性值 Form1 Caption 服务器端 Label1 Caption 待发送数据 Label2 Caption 已接受数据 Lb1IPAddress Caption 服务器IP: cmdSendData Caption 发送 cmdExit Caption 退出 sbWinsockState Width 4725 sktTCPChatServer Rrotocal 0-sckTCPRrotocal 2.4 程序介绍 1.服务器端 一个Winsock 控件可以建立与一个计算机的联接服务器程序中首先设置一个Winsock 控件将其索引值设为0以便在运行时动态增减元素这样可以与多个计算机进行对话。
服务
程序部分服务器程序启动时先设置自己的本地端口因为有些端口有其固定的作用如80 是WWW 端口故尽可能选择不可能使用的端口这里我选择了1001。
将连接状态设置为假然后开始进行侦听。
当侦听到有计算机要求与服务器进行对话就3 接受并记录下客户机的地址、端口、客户起的匿名将连接状态设置为真将上述内容存入一个用户自定义的数组中进行动态维护。
用户自定义数据类型如下 Private Type ActiveUser ClientIP As String 记录客户的IP地址 ClientName As String 记录客户的匿名 ClientPort As Integer 记录当前会话的端口 ClientConnected As Boolean客户连接状态True表示已连接False表示没有连接End Type 做完这些工作后服务器再调入一个新控件进行新的侦听如此反复不断。
如果有客户退出则关闭相应的连接。
注意不能在客户端关闭连接否则会产生错误只能由服务器关闭连接。
服务程序中三个关键程序段如下处理连接请求sckServer_ConnectionRequest 过程处理连接请求当远程计算机要求连接时服务器首先检查用户自定义数组中是否有空闲位置因为在谈话中途肯定会有人退出所以会产生空闲位置如果有则选择空闲位置给予要求连接的客户否则将数组维数加一将之给予请求连接的远程节点。
错误处理主要是忽略两个或两个以上的客户同时要求连接时产生的地址冲突现象。
处理处于连接状态的用户发送来的信息sckServer_DataArrival 过程处理客户端传来的数据。
当有数据发送过来后服务器首先接收数据调用自定义过程HandleOth- erMessage 检查是谈话内容还是其它信息如果是其它信息则在HandleOtherMessage 中进行处理否则在本过程中进行处理。
因为Winsock 控件将数据首先送至缓冲区待缓冲区满才发送信息这显然不能保证适时对话用Doevents 语句可确保Windows 将数据及时送出。
其中的错误处理程序处理当远程计算机非正常关闭程序时产生的错误因为此时服务器并不知道它已关闭仍然向它发送信息这样就会产生错误导致服务程序关闭中断整个谈话。
处理方法只是简单地关闭掉该连接即可。
关闭客户连接sckServer_Close 过程关闭与客户的连接删除控件收回系统资源将该位置的连接状态设置为假以便有用户请求连接时继续使用。
它一般由HandleOtherMessage 过程调用。
2.客户端 客户端程序启动时首先设置服务器的地址及端口这里我直接使用了“192.168.1.8 6”这是我的服务器地址可以在Form_load 过程中设置你自己的服务器地址也可在程序开始时让用户输入服务器地址以增加灵活性。
时钟控件用以与远程节点进行自动连接。
客户程序主要对象设置 “”显示所有正在聊天室中的用户名显示当前的状态用户名IP 地址及是否密谈。
与服务器程序一样这里列出的并非全部的控件但是已经足以完成工作。
客户程序中的自定义类MyMessage 用来记录自己的信息。
类中的变量cmdExitClick 用来记录用户是否按了退出按钮如果是按了退出按钮则为真。
当用户选择了
系统的窗体关闭菜单而没有按退出按钮时将会产生错误因此用它来记录是如何退出的如果选择了系统的窗体关闭菜单则执行一次cmdExit_Click过程以确保无误。
客户退出时不是简单地关闭自己的Winsock 控件而是发送一个字符串我采用了一个大家在聊天时很难用到的字符串“_RE”给服务器表明自己要退出由服务器端关闭连接进而关闭自身。
4 第3章 TCP协议相关知识 TCP/IP协议Trans
mission Control Protocol/Internet Protocol传输控制协议/互联网络协议是Internet最基本的协议。
TCP/IP协议是一组包括TCP协议和IP协议UDPUser Datagram Protocol协议、ICMPInternet Control Message Protocol协议和其他一些协议的协议组。
TCP/IP中的协议 1.IP 网际协议IP是TCP/IP的心脏也是网络层中最重要的协议。
IP层接收由更低层网络接口层例如以太网设备驱动程序发来的数据包并把该数据包发送到更高层---TCP或UDP层相反IP层也把从TCP或UDP层接收来的数据包传送到更低层。
IP数据包是不可靠的因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址源地址和接收它的主机的地址目的地址。
高层的TCP和UDP服务在接收数据包时通常假设包中的源地址是有效的。
也可以这样说IP地址形成了许多服务的认证基础这些服务相信数据包是从一个有效的主机发送来的。
IP确认包含一个选项叫作IP source routing可以用来指定一条源地址和目的地址之间的直接路径。
对于一些TCP和UDP的服务来说使用了该选项的IP包好象是从路径上的最后一个系统传递过来的而不是来自于它的真实地点。
这个选项是为了测试而存在的说明了它可以被用来欺骗系统来进行平常是被禁止的连接。
那么许多依靠IP源地址做确认的服务将产生
问题并且会被非法入侵。
2.TCP 如果IP数据包中有已经封好的TCP数据包那么IP将把它们向‘上’传送到TCP层。
TCP将包排序并进行错误检查同时实现虚电路间的连接。
TCP数据包中包括序号和确认所以未按照顺序收到的包可以被排序而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序例如Telnet的服务程序和客户程序。
应用程序轮流将信息送回TCP层TCP层便将它们向下传送到IP层设备驱动程序和物理介质最后到接收方。
面向连接的服务例如Telnet、FTP、rlogin、X Windows和SMTP需要高度的可靠性所以它们使用了TCP。
DNS在某些情况下使用TCP发送和接收域名数据库但使用UDP传送有关单个主机的信息。
第4章 程序设计界面 在编写
VB程序之前首先设计两个用于聊天的程序窗口一个是服务器端一个是客户端按照该窗口的相应位置编写程序。
窗口如下 5 图1客户端 图2服务器端 第5章 程序设计实现
代码 客户端程序
代码如下: Option Explicit Private bConnected As Boolean Private Const FormSpace50 Private Sub Form_Load //初始化窗口sktTCPChatClient.RemoteHostsktTCPChatClient.LocalHostName //设置远程计算机 bConnectedFalse //没有连接 cmdSendData.Enabled False //不能发送数据 sbWinsonkState.Panels1”你的IP地址是”amp sktTCPChatClient.LocalIP End Sub Private Sub cmdConnect_Click Dim MessageTitleDefault Myvalue If bConnected Then //处理已连接 sbWinsonkState.Panels1”断开连接” cmdSendData.EnabledFalse //不能发送数据 cmdConnect.EnabledFalse //不能连接 sktTCPChatClient.SendData “QUIT” //向服务端发送退出指令 Else //没有连接时创建连接sktTCPChatClient.Close //首先关闭TCP连接 Message”输入服务端IP地址或主机名缺省时为本机IP地址:ampsktTCPChatClIen- t.LocalIP //设置提示信息 Title”设置服务端地址” //设置标题 DefaultsktTCPChatClient.LocalIP //设置缺省IP地址 MyvalueInputBoxMessageTitleDefault // 输入服务端IP地址 If Myvalue” ”ThenMsgBox”需要输入IP地址” Else sktTCPChatClient.RemoteHost Myvalue sktTCPChatClient.Connect //连接服务器 sbWinsonkState.Panels1”正在连接??服务器IP地址:”ampsktTCPChatClient.Remot cmdConnect.EnabledFalse DoEvents //处理事件 6 Loop Until sktTCPChatClient.StatesckConnected_ Or sktTCPChatClient.StatesckError If sktTCPChatClient.State sckError Then //处理例外 cmdConnect.EnabledTrue sbWinsonkState.Panels1”找不到主机” amp sktTCPChatClient.RemoteHost MsgBox sktTCPChatClient.RemoteHost amp”服务器端没有运行。
请首先运行服务器进程‘服务器端’” Else cmdConnect.Caption”断开连接” //改变按钮 bConnectedTrue cmdConnect.EnabledTrue //能连接 cmdSendData.EnabledTrue //能发送数据 End If End If End If End Sub Private Sub cmdSendData_Click Dim sendtext As String Sendtext sktTCPChatClient.LocalIPamp”主机:”amp sktTCPChatClient.LocalHostNameamp ”端口”amp sktTCPChatClient.LocalPortamp”发送:”amp txtDataToSend.Text //发送的数据 sktTCPChatClient. SendData sendtext txtDataReceived.Forecolor200 //接收数据颜色 txtDataReceived.SelTextsendtextampvbCrLf txtDataToSend.Text” ” End Sub Private Sub cmdExit_Click Unload Me End Sub Private Sub Form_QueryUnloadCancle As IntegerUnloadMode As Integer sktTCPChatClient.Close // 关闭TCP连接 End Sub Private Sub Form_Resize //改变窗口大小时调整控件位置 End Sub Private Sub sktTCPChatClient_Connect //连接成功 If sktTCPChatClient.StatesckConnected Then sbWinsonkState.Panels1sktTCPChatClientamp”成功连接到”ampsktTCPChatClient. RemoteHostIP End If End Sub Private Sub sktTCPChatClient_DataArrivalByVal bytesTotal As Long//接收数据 Dim sendtext As String sktTCPChatClient.GetData DataReceivedvbString //接收数据 txtDataReceived.Forecolor200 //接收数据颜色 7 txtDataReceived.SelTextDataReceived amp vbCrLf //显示接收数据 End Sub Private Sub sktTCPChatClient_Close //处理断开连接 cmdConnect.EnabledFalse cmdSendData.EnabledFalse sktTCPChatClient.Close Do sbWinsonkState.Panels1”状态:”ampWinsockStateStringsktTCPChatClient.State DoEvents Loop Until sktTCPChatClient.StatesckClosed bConnectedFalse cmdConnect.Caption”连接” cmdSendData.EnabledTrue End Sub Private Function WinsockStateStringWinsockState As Integer As String Select Case WinsockState Case sckClosed WinsockStateString”已断开” Case sckClosing WinsockStateString”同级人员正在关闭连接” Case sckConnected WinsockStateString”已连接” Case sckConnecting WinsockStateString”正在连接” Case sckConnectionPending WinsockStateString”连接挂起” Case sckHostResolved WinsockStateString”主机断开” Case sckConnectionPending WinsockStateString”连接挂起” Case sckHostResolved WinsockStateString”主机断开” Case sckError WinsockStateString”错误” Case sckListening WinsockStateString”侦听” Case sckResolvingHost WinsockStateString”识别主机” Case sckOpen WinsockStateString”打开” Case Else WinsockStateString”未知状态” End Select End Function 8 服务器端程序
代码如下: Option Explicit Private Type tActiveSocket Connected AsBoolean ClientIPAddress As String ClientName As String End Type Private gActiveSockets As tActiveSocket Private Const FormSpace 50 Private Sub Form_Load //窗口初始化 ReDim gActiveSockets0 sktTCPChatServer0.RemoteHost sktTCPChatServer0.LocalHostName //设置远程计算机 sktTCPChatServer0.LocalPort 1001 sktTCPChatServer0.Listen lb1IPAddress.Caption ”服务器IP”amp sktTCPChatServer0.LocalIP sbWinsockStatus.Panels1 ”主机名:”ampsktTCPChatServer0.LocalHostName End Sub Private Sub Form_QueryUnloadCancel AsIntegerUnloadMode As Integer Dim ArrayIndex As Integer For ArrayIndex 1 To UBoundgActiveSockets If gActiveSocketsArrayIndex.Connected Then sktTCPChatServer ArrayIndex.Close Unload sPCktTChatServerArrayIndex End If Next ArrayIndex End Sub Private Sub Form_Resize //改变窗口大小时调整设置控件位置 End Sub Private Sub cmdSendData_Click Dim ArrayIndex As Integer Dim sendtext As String If UboundgActiveSockets 0 Then MsgBox”没有客户与服务器建立连接” Else For ArrayIndex 1 To UboundgActiveSockets If gActiveSocketsArrayIndex.Connected Then sktTCPChatServer ArrayIndex.SendData sktTCPChatServerArrayIndex.LocalIPamp_ “主机名:” amp sktTCPChatServer ArrayIndex. LocalHostName amp “端口:” amp sktTCPChatServer ArrayIndex.LocalPort amp”发送:”amp txtDataToSend.Text DoEvents End If Next ArrayIndex 9 txtDataReceived.SelText sktTCPChatServer0.LocalIPamp”主机:”amp sktTCPChatServer0. LocalHostName amp ”端口:”amp sktTCPChatServer0.LocalPort amp”发送:”amp txtDataToSend.Text ampVbCrLf txtDataToSend.Text “ ” End If End Sub Private Sub cmdExit_Click Unload Me End Sub Private Sub sktTCPChatServer_ConnectionRequest Index As Integer ByVal requestID As Long //连接请求 Dim ArrayIndex As Integer Dim OpenSocketPos As Integer Dim Dummy As String ArrayIndex 0 OpenSocketPos 0 Do WhileOpenSocketPos 0 And ArrayIndexltUBoundgActiveSockets ArrayIndex ArrayIndex 1 If Not gActiveSocketsArrayIndex.Connected Then OpenSocketPos ArrayIndex End If Loop If OpenSocketPos 0 Then OpenSocketPos UBoundgActiveSockets1 ReDim Preserve gActiveSocketsOpenSocketPos End If Load sktTCPChatServerOpenSocketPos gActiveSocketsOpenSocketPos.Connected True sktTCPChatServerOpenSocketPos.Accept requestID gActiveSocketsOpenSocketPos.ClientIPAddresssktTCPChatServerOpenSocketPos.Remote-HostIP sbWinsockStatus.Panels1 ”总计”ampOpenSocketPosamp”个客户连接到本服务器”amp gActiveSocketsOpenSocketPos.ClientIPAddress End Sub Private Sub sktTCPChatServer_DataArrivalIndex As IntegerByVal bytesTotal As Long //接收数据 Dim DataReceived As String Dim ArrayIndex As Integer sktTCPChatServerIndex.GetData DataReceivedvbString //接收数据 If CStrDataReceived ”QUIT” Then sktTCPChatServer_Close Index Else For ArrayIndex 1 To UboundgActiveSockets If ArrayIndexltgtIndex AndgActiveSocketsArrayIndex.Connect Then 10 sktTCPChatServerArrayIndex.SendData gActiveSocketsIndex.ClientIPAddress amp “:”ampDataReceived DoEvents End If Next ArrayIndex txtDataReceived.ForeColor 200 //接受数据颜色 txtDataReceived.SelText DataReceived amp vbCrLf //显示接收数据 End If End Sub Private Sub sktTCPChatServer_ConnectIndex As Integer //连接完成 gActiveSocketsIndex.Connected True //连接成功 gActiveSocketsIndex.ClientIPAddress sktTCPChatServerIndex.RemoteHostIP sbWinsoc.