📄 60.htm
字号:
<p>如何用Visual Basic编写小型的网络系统</p>
<p></p>
<p></p>
<p>中国科大附中 徐 江</p>
<p></p>
<p>Visual Basic 以下简称(VB) 十一个功能强大的编程语言。特别是4.0 以后,支持了OLE Automation 技术,给编程带来了更大的方便。前些时,我试着编写一个支持网络的数据库。但是由于没有联网,所以没法测试。于是,我想到了OLE Automation,用它就可以在一台机器上测试网络功能。经过改动,还可以用它通过Modem 来进行联机。下面,我介绍一下如何用Visual Basic 编写小型的网络系统。</p>
<p>首先,建立一个支持网络OLE Automation </p>
<p>启动VB。在窗体Form1 中建立一个列表框List1,在它上面建一个Frame1,设置它的Caption 属性为空。在它中间建立一个Label1,同样,设置它的Caption 也为空。最后,在List1 上建立一个Caption 为UserList 的Label2。最后,把一个定时器Timer1 安上,把它的Interval 设为3000,Enabled 设为False 就行了。至此,NetWorkConnection 的窗体部分就完成了。</p>
<p>随后,在VB 的Tools 菜单中选Options,按照填好各项内容。</p>
<p>接下来,在Insert 菜单中选取Module 建立一个新的模块Module1。在(General) 中输入填写进下列代码。</p>
<p></p>
<p>'(UserInfo数据类型)</p>
<p>Type UserInfo</p>
<p>Username As String</p>
<p>Alias As Integer </p>
<p>End Type</p>
<p>'(最大的用户数)</p>
<p>Public Const MaxUser = 10</p>
<p>'(定义消息)</p>
<p>Public Const Msg_User_LogOn = 1</p>
<p>Public Const Msg_User_LogOff = 2</p>
<p>'(设定数据类型)</p>
<p>Public Users (MaxUser) As UserInfo</p>
<p>Public Inbox (MaxUser) As String</p>
<p>Public UserSystemInbox As Integer</p>
<p>Public Online(MaxUser) As Boolean</p>
<p></p>
<p>Sub main()</p>
<p>Form1.Show</p>
<p>End Sub</p>
<p></p>
<p>UserInfo 数据类型记录了已经登录的用户的用户名和别名。在显示和通讯时只使用别名。用户名只作为判断用户是否有效时用。出于安全考虑,以上数据用户不能随意访问,必须通过下面的子程序来访问。</p>
<p>在Insert菜单中选取Class Module 建立一个新的类Class1。更名为Common,并设置它的各个属性。</p>
<p>填写进下列代码。</p>
<p>(提供获取用户ID 值的功能,用户可以通过此功能使用别名来返回ID值) </p>
<p></p>
<p>Public Function GetUserID(Alias As String) As Integer</p>
<p>For i = 1 To MaxUser</p>
<p>If Users(i).Alias = Alias Then GetUserID = i</p>
<p>Next i</p>
<p>End Function</p>
<p></p>
<p>(提供获得系统信息的功能。用户可以通过它了解用户是否有改动) </p>
<p></p>
<p>Public Function GetSystemMessage() As Integer</p>
<p>GetSystemMessage = UserSystemInbox</p>
<p>End Function</p>
<p></p>
<p>(提供获得用户信息的功能。用它来获取所有在线用户的别名,中间用"|"分开。)</p>
<p></p>
<p>Public Function GetUserInfo() As String</p>
<p>For i = 1 To MaxUser</p>
<p>If Users(i).Username < > "" Then</p>
<p>temp = temp + Users(i).Alias + "|"</p>
<p>End If</p>
<p>Next i</p>
<p>GetUserInfo = temp</p>
<p>End Function</p>
<p></p>
<p>(提供获得用户私有信息的功能。用来接受别的用户发送的信息。)</p>
<p></p>
<p>Public Function GetUserMessage(ID As Integer) As String</p>
<p>If ID < = 0 Or ID > MaxUser Then</p>
<p>Exit Function</p>
<p>End If</p>
<p>GetUserMessage = Inbox(ID)</p>
<p>End Function</p>
<p></p>
<p>(提供注销功能。用来退出网络。)</p>
<p></p>
<p>Public Function LogOff(ID As Integer) As Boolean</p>
<p>If ID < = 0 Or ID > MaxUser Then</p>
<p>LogOff = False</p>
<p>Exit Function</p>
<p>End If</p>
<p>If Users(ID).Username < > "" Then</p>
<p>Users(ID).Username = ""</p>
<p>LogOff = True</p>
<p>Else</p>
<p>LogOff = False</p>
<p>End If</p>
<p>UserSystemInbox = Msg_User_LogOff</p>
<p>'-------------- Update Form1 ------------</p>
<p>For i = 0 To Form1.List1.ListCount - 1</p>
<p>If Form1.List1.List(i) = Users(ID).Alias Then </p>
<p>'查找List1中的用户别名并删除</p>
<p>Form1.List1.RemoveItem i</p>
<p>Exit For</p>
<p>End If</p>
<p>Next i</p>
<p>If Form1.List1.ListCount = 0 Then '如果没有用户登录</p>
<p>Form1.Label1.Caption = "DisConnected"</p>
<p>Form1.timer1.Enabled = False</p>
<p>End If</p>
<p>End Function</p>
<p></p>
<p>(提供登录功能来上网)</p>
<p></p>
<p>Public Function LogOn(Username As String, Alias As String) As Integer</p>
<p>For i = 1 To MaxUser</p>
<p>If Users(i).Username = "" Then</p>
<p>Users(i).Username = Username</p>
<p>Users(i).Alias = Alias</p>
<p>LogOn = i</p>
<p>UserSystemInbox = Msg_User_LogOn '发送"用户登录"信息</p>
<p>'-------------- Update Form1 ------------</p>
<p>Form1.List1.AddItem Alias '有用户上网</p>
<p>Form1.Label1.Caption = "Connected"</p>
<p>Form1.timer1.Enabled = True</p>
<p>Exit Function</p>
<p>End If</p>
<p>Next i</p>
<p>LogOn = 0</p>
<p>End Function</p>
<p></p>
<p>(提供刷新用户是否在线标志的功能。使系统能够判断你是否在线上,如果在6 秒内没有调用此功能,系统将会把您自动删除。)</p>
<p></p>
<p>Public Sub Refresh(ID As Integer)</p>
<p>If ID < = 0 Or ID > MaxUser Then Exit Sub</p>
<p>Online(ID) = True</p>
<p>End Sub</p>
<p></p>
<p>(提供发送用户私有信息的功能。用来和其它用户传递信息。)</p>
<p></p>
<p>Public Function SendUserMessage(Message As String, ToID As Integer) As Boolean</p>
<p>If ToID < = 0 Or ToID > MaxUser Then</p>
<p>SendUserMessage = False</p>
<p>Exit Function</p>
<p>End If</p>
<p>Inbox(ToID) = Message</p>
<p>SendUserMessage = True</p>
<p>End Function</p>
<p></p>
<p>在Form1 的Code 中输入剩下的代码。</p>
<p></p>
<p>'(初始化Form1)</p>
<p>Private Sub Form_Load()</p>
<p>Label1.Caption = "DisConnected"</p>
<p>Form1.Caption = "NetWork Connected Server"</p>
<p>Form1.Show</p>
<p>For i = 1 To MaxUser</p>
<p>Users(i).Username = ""</p>
<p>Next i</p>
<p>End Sub</p>
<p></p>
<p>(通过判断Online 的值定时检查用户是否在线) </p>
<p></p>
<p>Private Sub timer1_Timer()</p>
<p>For i = 1 To MaxUser</p>
<p>If Users(i).Username < > "" Then</p>
<p>If Online(i) = False Then</p>
<p>For s = 0 To List1.ListCount - 1</p>
<p>If List1.List(s) = Users(i).Alias Then</p>
<p>List1.RemoveItem s</p>
<p>Users(i).Username = ""</p>
<p>UserSystemInbox = Msg_User_LogOff</p>
<p>'发送"用户注销"信息</p>
<p>End If</p>
<p>Next s</p>
<p>End If</p>
<p>Online(i) = False</p>
<p>End If</p>
<p>Next i</p>
<p>If List1.ListCount = 0 Then</p>
<p>'如果没有用户</p>
<p>Label1.Caption = "DisConnected"</p>
<p>timer1.Enabled = False</p>
<p>End If</p>
<p>End Sub</p>
<p></p>
<p>运行此程序。在启动另一个VB,开始编写用户部分。在默认窗体中按下图排好这些控件。</p>
<p></p>
<p>填入下列代码</p>
<p></p>
<p>Public ID As Integer</p>
<p>Public Connected As Object</p>
<p>Private Sub Command1_Click() '登录</p>
<p>Dim username As String</p>
<p>Dim alias As String</p>
<p>Set Connected = CreateObject("NetWorkConnection.Common") '启动NetWorkConnection</p>
<p>username = Text1.Text</p>
<p>alias = Text2.Text</p>
<p>ID = Connected.logon(username, alias) '登录并返回ID值</p>
<p>Timer1.Enabled = True</p>
<p>Command4_Click</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Command2_Click() '注销</p>
<p>x = Connected.logoff(ID)</p>
<p>Timer1.Enabled = False</p>
<p>Set x = Nothing '释放对象</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Command3_Click() '发送用户信息</p>
<p>Dim TempID As Integer</p>
<p>Dim TempString As String</p>
<p>Dim x As String</p>
<p>Dim y As Boolean</p>
<p>x = Combo1.Text</p>
<p>TempID = Connected.getuserid(x) '获得指定用户的ID值</p>
<p>TempString = Text3.Text</p>
<p>y = Connected.sendusermessage(TempString, TempID)</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Command4_Click()</p>
<p>For i = 0 To Combo1.ListCount 1 '清空Combo1</p>
<p>Combo1.RemoveItem 0</p>
<p>Next i</p>
<p>x = Connected.GetUserInfo '接收用户信息</p>
<p>cd$ = x</p>
<p>lastst = 1</p>
<p>For i = 1 To Len(cd$)</p>
<p>If Mid$(cd$, i, 1) = "|" Then</p>
<p>Namef$ = Mid$(cd$, lastst, i - lastst)</p>
<p>Combo1.AddItem Namef$ '分离用户别名并加入Combo1</p>
<p>lastst = i + 1</p>
<p>End If</p>
<p>Next i</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Form_Load()</p>
<p>Timer1.Enabled = False</p>
<p>Timer1.Interval = 300</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Timer1_Timer()</p>
<p>Connected.Refresh (ID) '刷新用户标志</p>
<p>x = Connected.GetSystemMessage() '接收系统信息</p>
<p>y = Connected.GetUserMessage(ID) '接收用户信息</p>
<p>If y < > "" And y < > Label6.Caption Then Label6.Caption = y</p>
<p>If x < > Val(Label4.Caption) Then '刷新Combo1</p>
<p>Label4.Caption = x</p>
<p>Command4_Click</p>
<p>End If</p>
<p>End Sub</p>
<p></p>
<p>开始运行。输入你的Username 和Alias,单击Log On,查看一下先前的VB 范例,看看你的名字是否在内。如果是,证明你的" 集线器" 成功了。这时,不管已登录的用户处于什么原因没有用LogOff 就中断联系,系统都会在6 秒后自动删除这些用户。确保其它用户不受影响。</p>
<p>这个程序经过改动,可以给它支持Modem 的功能。而用户部分的程序可以原封不动。编译时在Options 中选中Remote Support File 并利用附带的安装程序安装到网络服务器上就可以真正实现" 联网" 了。</p>
<p></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -