nternet上的聊天室一向是一个吸引人的地方,但多用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。将连接状态设置为假,然后开始进行侦听。当侦听到有计 算机要求与服务器进行对话,就接受,并记录下客户机的地址、端口、客户起的匿名,将连接状 态设置为真,将上述内容存入一个用户自定义的数组中,进行动态维护。用户自定义数据类型 如下:
PrivateTypeActiveUser
ClientIPAsString记录客户的IP地址
ClientNameAsString记录客户的匿名
ClientPortAsInteger记录当前会话的端口
ClientConnectedAsBoolean
客户连接状态,True表示已连接,False表示没有连接
EndType
做完这些工作后,服务器再调入一个新控件,进行新的侦听,如此反复不断。如果有客户 退出,则关闭相应的连接。注意不能在客户端关闭连接,否则会产生错误,只能由服务器关闭 连接。服务器程序主要对象设置
.
.
.
利用上述对象可以实现服务器的各种功能,当然,还可以再加入新控件,以使界面更美 观。
服务程序中三个关键程序段如下:
1.处理连接请求
sckServer_ConnectionRequest过程处理连接请求,当远程计算机要求连接时,服务器首先 检查用户自定义数组中是否有空闲位置(因为在谈话中途,肯定会有人退出,所以会产生空闲 位置),如果有则选择空闲位置给予要求连接的客户,否则将数组维数加一,将之给予请求连 接的远程节点。错误处理主要是忽略两个或两个以上的客户同时要求连接时产生的地址冲突 现象。
......
2.处理处于连接状态的用户发送来的信息
sckServer_DataArrival过程处理客户端传来的数据。当有数据发送过来后,服务器首先接 收数据,调用自定义过程HandleOtherMessage检查是谈话内容还是其它信息,如果是其它信 息,则在HandleOtherMessage中进行处理,否则在本过程中进行处理。
因为Winsock 控件将数据首先送至缓冲区,待缓冲区满才发送信息,这显然不能保证适时对话,用Doevents 语句可确保Windows将数据及时送出。其中的错误处理程序处理当远程计算机非正常关闭程 序时产生的错误,因为此时服务器并不知道它已关闭,仍然向它发送信息,这样就会产生错误, 导致服务程序关闭,中断整个谈话。处理方法只是简单地关闭掉该连接即可。