用VB编写即时通讯软件的具体过程和代码。
对于局域网用户中的编程爱好者来说,如果能自己编写一个局域网通信程序该有多好!但是,如果想完全靠自己从零开始编写一个通信程序,就必须对相关的网络协议等底层技术有更深入的了解,这并不是一件容易的事情。现在有了Winsock控件,一切都不同了。它为您封装了所有复杂的技术细节,并提供了访问TCP和UDP网络服务的便捷方式。通过设置控件的属性并调用其方法,您可以轻松地连接到远程计算机,还可以双向交换数据,而无需了解TCP的详细信息或调用低级Winsock APIs。
Winsock控件可供Microsoft Acess、Visual Basic、Visual C++或Visual Foxpro的开发人员使用。本文以Visual Basic 6企业版为开发环境,介绍Winsock控件的初步应用。
Winsock控件可以使用两种协议:TCP协议和UDP协议,下面分别介绍。
TCP协议是数据传输协议,它允许创建和维护与远程计算机的连接,以便它们可以相互传输数据。使用TCP协议进行通信,需要分别建立客户端应用程序和服务器应用程序。
创建客户端应用程序时,必须知道服务器计算机名称或其IP地址(存储在RemoteHost属性中)以及服务器计算机侦听的端口(存储在RemotePort属性中),然后调用Connect方法。
创建服务器应用程序时,您应该设置一个监听端口(LocalPort属性)并相应地调用listen方法。ConnectionRequest事件在客户端需要连接时发生。若要完成连接,可以在ConnectionRequest事件中调用Accept方法。建立连接后,任何一台计算机都可以发送和接收对方的数据。如果要发送数据,需要调用SendData方法。当接收到数据时,会发生DataArrival事件,通过调用DataArrival事件中的GetData方法可以获得对方发送的数据。
说了这么多,你可能还是不太了解。我来用程序详细解释一下。
如果只有两台电脑,那就很容易了。假设A机为客户端,B机为服务器,其IP为192.192.192.1,接收端口为1200(随便选一个不用的端口)。首先,在A计算机的客户端程序中添加一个Winsock控件,名为sckconnect,并设置其属性:remote host = " 192.192.1 ",(即A计算机的IP地址),如果在
在b机的服务器程序中添加Form_Load()。
Sckserver (0)。BindSckserver (0)。“LocalPort”绑定到本地端口。
Sckserver (0)。听着听着。
如果要传输数据,两台计算机必须先建立连接。建立连接的过程如下:
客户端必须首先请求连接。
sckconnect.connect sckconnectRemoteHost,sckconnect。远程端口
当执行这句话时,会触发服务器程序中的ConnectRequest事件,并在此过程中决定是否建立连接。其代码如下:
private sub sck server _ connection request(index为整数,Byval requestid为长整型)
如果sckserver.count=1,则
加载sckserver(1)
sckserver(1)。接受requestId
如果…就会结束
末端接头
建立连接后,计算机A或计算机B都可以使用SendData方法传输数据。例如,如果计算机要传输一个名为string的字符串,只需添加:
sckconnect。发送数据字符串
a计算机传输数据后,会触发B计算机的DataArrival事件,在这个过程中,你可以使用GetData方法接收传输的数据:
private sub sck server _ data arrival(Index为整数,Byval BytesTotal为长整型)
dim sdata作为字符串
sckserver(1)。GetData sdata,vbstring
末端接头
最后,在关闭程序之前,不要忘记关闭Winsock控件。
privat子窗体_unload(取消为整数)
如果sckconnect.state & lt& gt那时关闭了
sckconnect.close
如果…就会结束
末端接头
这只是最简单的情况。如果有多台电脑,就稍微复杂一点。客户端程序可以保持不变,而服务器程序需要稍作修改:
private sub sck server _ connect request(Index为整数,Byval requestid为长整型)
dim sip as string
将I标注为整数
Sip=sckserver(0)。“RemoteHostIP”来获取登录的IP地址。
I=1
当我& lt=sckserver.ubound '检查是否已经有此地址的记录。
如果sckserver (i)。remotehostip = sipthen '如果是,则不需要加载新的控件。
Sckserver(I)。接受requestid
出口接头
如果…就会结束
I=I+1
环
否则,加载一个新的控件。
sck server(I)。接受requestID
末端接头
注意,上述信息对话实际上发生在客户端和服务器之间。如果每个人的话都能像聊天室一样被“听到”,那么就需要在服务器端的DataArrival事件中,将客户端收到的数据转发给所有客户端。
循环转发信息的编码如下:
For I=1 to sckserver.count
如果sckserver(I)。状态& lt& gt那时关闭了
sckserver(I)。发送数据sdata
如果…就会结束
接下来我
怎么样,这样我们就可以自己做通讯软件了!
不过不知道大家有没有注意到,以上的程序都是需要一台电脑作为服务器的,但是如果我们的局域网中没有一台电脑可以一直开机,也就是服务器端程序不运行,其他客户端程序就无法通信。而且这种情况可能会比较频繁!至少,我是这样用局域网的。所以我们享受不到局域网通信的乐趣?
别急,记住,我们的Winsock控件还有另一个主角:UDP协议。
UDP协议也称为用户数据报协议,是一种无连接协议。什么是无连接协议?也就是说,使用这种协议进行连接时,并不需要像TCP协议那样:服务器端需要监听,客户端请求连接,服务器端建立连接后,双方才能进行通信。另外,UDP应用可以是客户端程序,也可以是服务器程序,不需要像TCP应用那样单独建立客户端程序和服务器程序。
接下来简单描述一下UDP协议的通信过程:在UDP协议中,甲乙双方为了传输数据,必须分别设置两台机器的LocalPort属性;然后将A机的RemoteHost属性设置为B机的IP地址,将RemotePort属性设置为B机的LocalPort属性值。此时A机可以通过调用SendData方法来传输数据,B机也在DataArrival事件中使用GetData方法来获取A机发送给B机的信息。如果你想把数据从电脑B传到电脑A,你只需要模仿上面的流程设置就可以了。
使用UDP协议传输信息比TCP协议简单得多。它不需要监听,也不需要请求连接。就像我们平时寄信一样,只需要写下地址和收信人的名字就可以寄出去了。我们可以用这个来写一个局域网内的信息传输程序。下面简单介绍一下以下程序的功能和基本思路:
首先,我们必须希望程序的图标显示在系统托盘而不是任务栏!通过自己编程实现这一点并不容易。好在VB光盘上的common \ tools \ VB \ unsupported \ system tray里有现成的程序。我们只需要将其编译成systray.ocx控件,然后在编写自己的程序时添加这个控件即可。它的使用方法很简单,已经定义了鼠标点击、双击等事件,你只需要写相应的鼠标事件就可以了,这里就不多说了。
方案的重点是:UDP协议在通信时需要知道对方的IP和端口。如何实现这一点?最简单的方法是建立一个配置文件,里面包含局域网上每台计算机的名称、IP和端口,在程序初始化的时候读取所有的信息。在程序中,你只需要知道和谁通信,读取其对应的IP和端口。
我们知道每台电脑的IP和端口,但是怎么知道其他电脑是否在线,不然别人收不到消息怎么办?我们可以把这个程序放在启动菜单里,让它一开机就自动启动,并且最小化,放在窗口右下角的系统托盘里。当程序开始运行时,它会自动向它从配置文件中知道的所有IP发送一条消息:“我来了!”如果一台电脑在线,它会自动返回一条信息:“欢迎!“这样,两台计算机之间的通信就成功了,它们会把对方的名字加到自己的联系人列表中;如果一台电脑关机,程序会在退出前自动和大家说再见:“再见!" "接收此消息的计算机将自动从其通讯列表中删除发送此消息的计算机的名称。这样,如果有人不在线,你就无法给他们发送信息;如果除了您之外没有其他人打开,则您的发件人列表中不会有任何人。别人一上线就会自动跟你注册,一下线就会自动跟你告别,这样你就可以知道别人有没有在用电脑,你甚至可以用这个程序统计别人每天用电脑的时间。还不错!
好了,一个局域网通信程序的基本模型已经建立,并不复杂!让我们开始享受与我们自己的程序聊天吧!
但要想写出一个优秀的程序,不仅要有好的创意和功能,还要有兼容性和容错性。在这个例子中,没有详细解释错误处理。关于这一点,你可以在Winsock控件的错误事件及其帮助中找到满意的答案。
此外,还可以从以下几个方面考虑功能的扩展:如传输图形、声音等多媒体信息,局域网上互相传输文件(主动传输),历史通话记录,系统日志,个人电脑时间统计等。,所有这些都只取决于你的想象力和你的智力!下面,笔者以转账文件为例,谈谈其功能实现的代码。
您可以打开本地文件(图形、声音等。可以先存为临时文件)以二进制文件的形式,把它们的内容全部读入一个字节类型的数组。本地机器代码如下:
dim myfile()作为字节
变暗位置为长
将二进制文件的“文件名”作为#1打开
位置=0
do while not eof(1)
位置=位置+1
redim保留我的文件(1到位置)
获取#1,,我的文件(位置)
环
关闭#1
然后将这个字节数组传输到远程机器。
sckserver。发送数据我的文件
远程机器收到这个数组后,以二进制文件的形式打开一个新的目标文件,将数组的内容写入这个新打开的文件,如果是bmp图片就放入图片框,如果是wav文件就播放。这样,局域网中的两个人就可以通过语言、图片、文字进行交流。
远程机器代码如下:
private sub sck connect _ data arrival(byval bytes total as long)
dim接收文件(1到bytestotal)作为字节
sckconnect。GetData接收文件,vbarray+vbbyte
告诉Winsock控件它收到了字节数组类型的数据。
打开“c:\temp\ file name”作为#1二进制。
对于I=1至bytestotal
put #1,,远程数组(I)
接下来我
clost #1
末端接头