利用VB设计聊天室

发表于:2007-06-21来源:作者:点击数: 标签:
Internet 上的聊天室一向是一个吸引人的地方,但多用C 语言设计,我用 VB 设计了一个聊天室,取名为“升达自由论坛”,实际使用证明效果良好。 Internet 上的通讯协议是TCP/IP,Internet 上数据传输协议主要有TCP 和UDP,TCP 是有连接协议,它要求计算机进行

   

    Internet 上的聊天室一向是一个吸引人的地方,但多用C 语言设计,我用VB 设计了一个聊天室,取名为“升达自由论坛”,实际使用证明效果良好。

    Internet 上的通讯协议是TCP/IP,Internet 上数据传输协议主要有TCP 和UDP,TCP 是有连接协议,它要求计算机进行对话时必须先建立连接,保证数据传送安全到达目的地。UDP 是无连接协议,它只是将信息送到网络上,并不检查数据是否到达了目的地。要进行实时会话,则应该采用TCP 协议。本程序采用的协议就是TCP 协议。

    程序分服务和客户程序两部分。客户程序启动后首先与服务器连接,连接成功后,随意输入一个名字即可进入聊天室;服务程序则负责维护与每一个客户的连接和数据交换,并且记录下所有聊天内容,及人员名单。由于在会话过程中大家起的都是假名字,不可避免地要有的人讲一些不健康内容,为了保持秩序,服务器程序实现了IP 地址跟踪功能。管理人员可以很容易地查找出每一个匿名的计算机名,并对之进行警告或其它处理(下面会进一步介绍)。可保证会话内容的健康。如果服务器程序关闭,则所有客户程序自动关闭。

    VB5 的Winsock 控件

    VB5 企业版提供了Winsock 控件,要实现两台计算机的对话,可以通过Winsock 控件进行。而不需了解更多的数据传输细节,本程序就是通过Winsock 进行的。

    Winsock 有多种属性、方法和事件,本文只列举出要使用的属性、方法和事件。

    …………

    一个Winsock 控件可以建立与一个计算机的联接,服务器程序中首先设置一个Winsock 控件,将其索引值设为0,以便在运行时动态增减元素,这样可以与多个计算机进行对话。

    程序介绍

    服务程序部分服务器程序启动时,先设置自己的本地端口,因为有些端口有其固定的作用,如80 是WWW 端口,故尽可能选择不可能使用的端口,这里我选择了1600. 将连接状态设置为假,然后开始进行侦听。当侦听到有计算机要求与服务器进行对话,就接受,并记录下客户机的地址、端口、客户起的匿名,将连接状态设置为真,将上述内容存入一个用户自定义的数组中,进行动态维护。用户自定义数据类型如下:

    Private Type ActiveUser ClientIP As String 记录客户的IP地址ClientName As String       记录客户的匿名ClientPort As Integer      记录当前会话的端口ClientConnected As Boolean客户连接状态,True表示已连接,False表示没有连接End Type

    做完这些工作后,服务器再调入一个新控件,进行新的侦听,如此反复不断。如果有客户退出,则关闭相应的连接。注意不能在客户端关闭连接,否则会产生错误,只能由服务器关闭连接。服务器程序主要对象设置

    。

    利用上述对象可以实现服务器的各种功能,当然,还可以再加入新控件,以使界面更美观。

    服务程序中三个关键程序段如下:1 . 处理连接请求sckServer_ConnectionRequest 过程处理连接请求,当远程计算机要求连接时,服务器首先检查用户自定义数组中是否有空闲位置(因为在谈话中途,肯定会有人退出,所以会产生空闲位置),如果有则选择空闲位置给予要求连接的客户,否则将数组维数加一,将之给予请求连接的远程节点。错误处理主要是忽略两个或两个以上的客户同时要求连接时产生的地址冲突现象。

    …………

    2 . 处理处于连接状态的用户发送来的信息sckServer_DataArrival 过程处理客户端传来的数据。当有数据发送过来后,服务器首先接收数据,调用自定义过程HandleOtherMessage 检查是谈话内容还是其它信息,如果是其它信息,则在HandleOtherMessage 中进行处理,否则在本过程中进行处理。

    因为Winsock 控件将数据首先送至缓冲区,待缓冲区满才发送信息,这显然不能保证适时对话,用Doevents 语句可确保Windows 将数据及时送出。其中的错误处理程序处理当远程计算机非正常关闭程序时产生的错误,因为此时服务器并不知道它已关闭,仍然向它发送信息,这样就会产生错误,导致服务程序关闭,中断整个谈话。处理方法只是简单地关闭掉该连接即可。

    …………

    3. 关闭客户连接sckServer_Close 过程关闭与客户的连接,删除控件,收回系统资源,将该位置的连接状态设置为假,以便有用户请求连接时继续使用。它一般由HandleOtherMessage 过程调用…………

    如何保证聊天内容的健康是一个很重要的方面,在Internet 上,我们对谈话内容不健康者,只有将之开除出聊天室。但在局域网上则可以查出是谁谈话不文明(局域网环境为Windows NT4.0 服务器,Windows 95 工作站)。方法如下:在95 工作站上将网络中的TCP/IP 协议中的IP 地址选项设为动态获得IP 地址,在NT 服务器上用DHCP 管理工具为每一个客户机进行IP 地址动态分配。聊天服务程序记录下来了每一个客户的IP 地址,我们就可以通过DHCP 管理工具很容易地查出某IP 地址对应的计算机名,并进行处理。

    客户程序部分

    客户程序启动时首先设置服务器的地址及端口,这里我直接使用了“192.168.0.2”,这是我的服务器地址,可以在Form_load 过程中设置你自己的服务器地址,也可在程序开始时让用户输入服务器地址以增加灵活性。时钟控件用以与远程节点进行自动连接。

    …………

    客户程序主要对象设置…………

    “”显示所有正在聊天室中的用户名显示当前的状态(用户名,IP 地址及是否密谈)

    与服务器程序一样,这里列出的并非全部的控件,但是已经足以完成工作。

    客户程序中的自定义类MyMessage 用来记录自己的信息,…………

    类中的变量cmdExitClick 用来记录用户是否按了退出按钮,如果是按了退出按钮则为真。当用户选择了系统的窗体关闭菜单而没有按退出按钮时将会产生错误,因此用它来记录是如何退出的,如果选择了系统的窗体关闭菜单,则执行一次cmdExit_Click()过程,以确保无误。

    客户退出时,不是简单地关闭自己的Winsock 控件,而是发送一个字符串(我采用了一个大家在聊天时很难用到的字符串“=_RE”)给服务器,表明自己要退出,由服务器端关闭连接,进而关闭自身。

原文转自:http://www.ltesting.net