| 用VB编写网络寻呼机 |
| 来源: 作者: 发布时间:2007-04-29
|
|
提起ICQ的大名,爱好电脑的朋友一定不会感到陌生的吧?ICQ就是互联网上的寻呼机,无论什么时候,只要你的朋友在线,你只需在ICQ中输入他的ID号码,你就可以在互联网上呼到他。ICQ由于其方便、快捷,且拥有众多的注册用户而一举成为互联网上最流行的网络寻呼机,它几乎成为每一个上网用户的必备之物。当你在使用ICQ的时候,是否会想过自己动手编写一个网络寻呼机呢?这其实在VB中就可以实现。 ----网络寻呼的原理就是当客户端程序连接服务器时,通过服务器搜索所要呼叫的ID号码,如果检测到此用户且该用户正处于联网状态,则服务器通知此用户的客户端程序响应主叫方客户端程序,然后在主叫方和被叫方建立连接后,双方就可以聊天或进行其它的通信。
----在VB中编写网络寻呼机需要建立两个程序,一个为客户端程序Client,一个为服务器端程序Server。
----一、在Client工程中建立一个窗体,加载WinSock控件,称为tcpClient,协议选择TCP。再加入四个文本框,用以输入服务器的IP地址、服务器端口号,被呼叫的网络寻呼ID号以及用户登录ID号。然后再在窗体中加入三个按钮,分别命名为“连接”、“断开”和“退出”,点击“连接”按钮,并进行如下初始化连接,代码如下:
PrivateSubCommand1_Click() IfLen(Text1.Text)=0AndLen(Text2.Text)=0Then MsgBox("请输入主机名或主机IP地址。") ExitSub ElseIfLen(Text1.Text)>0Then tcpClient.RemoteHost=Text1.Text tcpClient.RemotePort=Text2.Text EndIf tcpClient.Connect Timer1.Enabled=True EndSub
PrivateSubCommand2_Click() tcpClient.Close '断开连接 EndSub
PrivateSubCommand3_Click() End EndSub
PrivateSubForm_Load() Text2.Text="1001" EndSub
PrivateSubtcpClient_Connect() tcpClient.SendData(Text3.Text&"@"&Text4.Text) EndSub
PrivateSubtcpClient_DataArrival(ByVal bytesTotalAsLong) DimstrDataAsString tcpClient.GetDatastrData strData=strData "呼叫" '在收到呼叫消息后弹出一对话框并显示主叫方ID号码 MsgBox(strData) EndSub
----二、在服务器端Server工程中也建立一个窗体,加载WinSock控件,称为tcpServer,协议选择TCP,设置其Index值为0,并在工程中添加模块。 ----内容如下:
PrivateTypeActiveUser ClientIPAsString'记录客户的IP地址 ClientPortAsInteger'记录当前会话的端口 ClientIDAsLong'记录客户的ID号码 ClientConnectedAsBoolean '客户连接状态,True表示已连接,False表示没有连接 EndType DimCurUser()AsActiveUser DimtcpIndexAsInteger'跟踪当前建立连接数
在Form_Load事件中加入如下代码: PrivateSubForm_Load() tcpServer(0).Protocol=sckTCPProtocol tcpServer(0).LocalPort=1001 '将LocalPort属性设置为一个整数。 tcpServer(0).Listen'然后调用Listen方法。 tcpIndex=1 EndSub
----准备应答客户端程序的请求连接,使用ConnectionRequest事件来应答户端程序的请求,代码如下: PrivateSubtcpServer_ConnectionRequest (IndexAsInteger,ByValrequestIDAsLong) DimiAsInteger OnErrorGoToErrHandle Fori=1TotcpIndex'选择一个空闲端口 IfCurUser(i).ClientConnected= FalseAndi<>tcpIndexThen LoadtcpServer(i) tcpServer(i).LocalPort=CurUser(i).ClientPort-1 tcpServer(i).AcceptrequestID ExitFor ElseIfCurUser(i).ClientConnected=FalseThen LoadtcpServer(i) tcpServer(i).LocalPort=Port IftcpServer(i).State<>sckClosedThen tcpServer(i).Close EndIf tcpServer(i).AcceptrequestID ExitFor EndIf Next DoEvents '测试连接是否成功 IftcpServer(i).State=sckConnectedThen Ifi=tcpIndexThen '已经没有可用端口,记录客户的IP地址和端口号 tcpIndex=tcpIndex 1 Port=Port 1 ReDimPreserveCurUser(tcpIndex) CurUser(i).ClientIP=tcpServer(i).RemoteHostIP CurUser(i).ClientConnected=True CurUser(i).ClientPort=Port CurUser(tcpIndex).ClientConnected=False Else CurUser(i).ClientIP=tcpServer(i).RemoteHostIP CurUser(i).ClientPort=Port CurUser(i).ClientConnected=True EndIf EndIf ExitSub ErrHandle: ResumeNext '检查控件的State属性,如未关闭,在接受新的连接之前关闭此连接。 IftcpServer(0).State<>sckClosedThen tcpServer(0).Close tcpServer(0).AcceptrequestID '接受具有requestID参数的,连接。 EndSub
PrivateSubtcpServer_DataArrival(IndexAsInteger, ByValbytesTotalAsLong) DimiAsInteger DimsAsString DimRequIDAsLong'主叫方ID号码 DimSearchIDAsLong'被叫方ID号码
OnErrorGoToErrHandle tcpServer(Index).GetDatas,vbString '接收数据并存入s IfMid(s,i,1)="@"Then '分离s中的主叫方和被叫方ID号码 SearhID=Left(s,i-1)'把号存入mKey RequID=Right(s,Len(s)-i)'ID存入RequID EndIf
----'如果是请求寻呼某一ID号码,则检索当前此ID用户是否登录(即CurUser数组中是否存在此用户),然后发送信息,通知此用户响应呼叫并显示主叫用户ID号码。 Fori=1TotcpIndex IfRequID=CurUser(i).ClientIDAndCurUser(i) .ClientConnected=TrueThen tcpServer(i).SendData(SearhID) EndIf Next ExitSub ErrHandle: IfErr.Number=sckBadStateThen'连接不正确 CurUser(i).ClientConnected=False CurUser(i).ClientIP="" UnloadtcpServer(i) ResumeNext EndIf EndSub
----本程序仅提供了用VisualBasic编写网络寻呼的思路和主要部分的实现过程,至于主叫方和被叫方建立连接后的通信并未扩展,读者若有兴趣,可在这方面加入具体的实现代码,就可以给本程序增加更多的功能,如实时聊天,语音对话等。如果在服务器程序检索到被叫方时,分别通知两者客户端程序,使主叫方和被叫方直接利用IP地址进行连接,则两者的连接速度将会有大幅度的提高。->
|
| |
|
| 上一篇:由VisualBasic5.0调用Explorer的方法 下一篇:如何通过VB获取网卡地址 |
|
【关闭窗口】 |
|
|
|