📄 17.htm
字号:
<p>编写网络寻呼机 </p>
<p>作者:岳兵</p>
<p></p>
<p> 提起ICQ的大名,爱好电脑的朋友一定不会感到陌生的吧?ICQ就是互联网上的寻呼机,无论什么时候,只要你的朋友在线,你只需在ICQ中输入他的ID号码,你就可以在互联网上呼到他。ICQ由于其方便、快捷,且拥有众多的注册用户而一举成为互联网上最流行的网络寻呼机,它几乎成为每一个上网用户的必备之物。当你在使用ICQ的时候,是否会想过自己动手编写一个网络寻呼机呢?这其实在VB中就可以实现。</p>
<p></p>
<p> 网络寻呼的原理就是当客户端程序连接服务器时,通过服务器搜索所要呼叫的ID号码,如果检测到此用户且该用户正处于联网状态,则服务器通知此用户的客户端程序响应主叫方客户端程序,然后在主叫方和被叫方建立连接后,双方就可以聊天或进行其它的通信。</p>
<p></p>
<p> 在VB中编写网络寻呼机需要建立两个程序,一个为客户端程序Client,一个为服务器端程序Server。</p>
<p></p>
<p> 一、在Client工程中建立一个窗体,加载WinSock控件,称为tcpClient,协议选择TCP。再加入四个文本框,用以输入服务器的IP地址、服务器端口号,被呼叫的网络寻呼ID号以及用户登录ID号。然后再在窗体中加入三个按钮,分别命名为“连接”、“断开”和“退出”,点击“连接”按钮,并进行如下初始化连接,代码如下: </p>
<p></p>
<p>Private Sub Command1_Click()</p>
<p> If Len(Text1.Text) = 0 And Len(Text2.Text) = 0 Then</p>
<p> MsgBox ("请输入主机名或主机IP地址。")</p>
<p> Exit Sub</p>
<p> ElseIf Len(Text1.Text) > 0 Then</p>
<p> tcpClient.RemoteHost = Text1.Text</p>
<p> tcpClient.RemotePort = Text2.Text</p>
<p> End If</p>
<p> tcpClient.Connect</p>
<p> Timer1.Enabled = True</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Command2_Click()</p>
<p> tcpClient.Close '断开连接</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Command3_Click()</p>
<p> End</p>
<p>End Sub</p>
<p></p>
<p>Private Sub Form_Load()</p>
<p> Text2.Text = "1001"</p>
<p>End Sub</p>
<p></p>
<p>Private Sub tcpClient_Connect()</p>
<p> tcpClient.SendData (Text3.Text&"@"&Text4.Text)</p>
<p>End Sub</p>
<p></p>
<p>Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)</p>
<p> Dim strData As String</p>
<p> tcpClient.GetData strData</p>
<p> strData = strData + "呼叫" </p>
<p>'在收到呼叫消息后弹出一对话框并显示主叫方ID号码</p>
<p> MsgBox (strData)</p>
<p>End Sub</p>
<p></p>
<p> 二、在服务器端Server工程中也建立一个窗体,加载WinSock控件,称为tcpServer,协议选择TCP,设置其Index值为0,并在工程中添加模块。内容如下: </p>
<p></p>
<p>Private Type ActiveUser</p>
<p> ClientIP As String '记录客户的IP地址</p>
<p> ClientPort As Integer '记录当前会话的端口</p>
<p> ClientID As Long '记录客户的ID号码</p>
<p> ClientConnected As Boolean '客户连接状态,True表示已连接,False表示没有连接</p>
<p>End Type</p>
<p></p>
<p>Dim CurUser() As ActiveUser</p>
<p>Dim tcpIndex As Integer '跟踪当前建立连接数</p>
<p></p>
<p> 在Form_Load事件中加入如下代码: </p>
<p></p>
<p>Private Sub Form_Load()</p>
<p> tcpServer(0).Protocol = sckTCPProtocol</p>
<p> tcpServer(0).LocalPort = 1001 </p>
<p> '将 LocalPort 属性设置为一个整数。</p>
<p> tcpServer(0).Listen '然后调用 Listen 方法。</p>
<p> tcpIndex = 1</p>
<p>End Sub</p>
<p></p>
<p> 准备应答客户端程序的请求连接,使用ConnectionRequest事件来应答户端程序的请求,代码如下: </p>
<p></p>
<p>Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)</p>
<p> Dim i As Integer</p>
<p> On Error GoTo ErrHandle</p>
<p> For i = 1 To tcpIndex '选择一个空闲端口</p>
<p> If CurUser(i).ClientConnected = False And i < > tcpIndex Then</p>
<p> Load tcpServer(i)</p>
<p> tcpServer(i).LocalPort = CurUser(i).ClientPort - 1</p>
<p> tcpServer(i).Accept requestID</p>
<p> Exit For</p>
<p> ElseIf CurUser(i).ClientConnected = False Then</p>
<p> Load tcpServer(i)</p>
<p> tcpServer(i).LocalPort = Port</p>
<p> If tcpServer(i).State < > sckClosed Then</p>
<p> tcpServer(i).Close</p>
<p> End If</p>
<p> tcpServer(i).Accept requestID</p>
<p> Exit For</p>
<p> End If</p>
<p> Next</p>
<p> DoEvents</p>
<p> '测试连接是否成功</p>
<p> If tcpServer(i).State = sckConnected Then</p>
<p> If i = tcpIndex Then </p>
<p> '已经没有可用端口,记录客户的IP地址和端口号</p>
<p> tcpIndex = tcpIndex + 1</p>
<p> Port = Port + 1</p>
<p> ReDim Preserve CurUser(tcpIndex)</p>
<p> CurUser(i).ClientIP = tcpServer(i).RemoteHostIP</p>
<p> CurUser(i).ClientConnected = True</p>
<p> CurUser(i).ClientPort = Port</p>
<p> CurUser(tcpIndex).ClientConnected = False</p>
<p> Else</p>
<p> CurUser(i).ClientIP = tcpServer(i).RemoteHostIP</p>
<p> CurUser(i).ClientPort = Port</p>
<p> CurUser(i).ClientConnected = True</p>
<p> End If</p>
<p> End If</p>
<p> Exit Sub</p>
<p> ErrHandle:</p>
<p> Resume Next </p>
<p> '检查控件的 State 属性,如未关闭,在接受新的连接之前关闭此连接。</p>
<p> If tcpServer(0).State <> sckClosed Then</p>
<p> tcpServer(0).Close</p>
<p> tcpServer(0).Accept requestID </p>
<p> '接受具有 requestID 参数的,连接。</p>
<p>End Sub</p>
<p></p>
<p>Private Sub tcpServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)</p>
<p> Dim i As Integer</p>
<p> Dim s As String</p>
<p> Dim RequID As Long '主叫方ID号码</p>
<p> Dim SearchID As Long '被叫方ID号码</p>
<p></p>
<p> On Error GoTo ErrHandle</p>
<p> tcpServer(Index).GetData s, vbString </p>
<p> '接收数据并存入s </p>
<p> If Mid(s, i, 1) = "@" Then </p>
<p> '分离s中的主叫方和被叫方ID号码</p>
<p> SearhID = Left(s, i - 1) '把号存入mKey</p>
<p> RequID = Right(s, Len(s) - i) 'ID存入RequID</p>
<p> End If</p>
<p></p>
<p> '如果是请求寻呼某一ID号码,则检索当前此ID用户是否登录(即CurUser数组中是否存在此用户),然后发送信息,通知此用户响应呼叫并显示主叫用户ID号码。</p>
<p> For i = 1 To tcpIndex</p>
<p> If RequID = CurUser(i).ClientID And CurUser(i).ClientConnected = True Then</p>
<p> tcpServer(i).SendData (SearhID)</p>
<p> End If</p>
<p> Next</p>
<p> Exit Sub</p>
<p> ErrHandle:</p>
<p> If Err.Number = sckBadState Then '连接不正确</p>
<p> CurUser(i).ClientConnected = False</p>
<p> CurUser(i).ClientIP = ""</p>
<p> Unload tcpServer(i)</p>
<p> Resume Next</p>
<p> End If</p>
<p>End Sub</p>
<p></p>
<p> 本程序仅提供了用Visual Basic 编写网络寻呼的思路和主要部分的实现过程,至于主叫方和被叫方建立连接后的通信并未扩展,读者若有兴趣,可在这方面加入具体的实现代码,就可以给本程序增加更多的功能,如实时聊天,语音对话等。如果在服务器程序检索到被叫方时,分别通知两者客户端程序,使主叫方和被叫方直接利用IP地址进行连接,则两者的连接速度将会有大幅度的提高。 </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -