时间: 2021-07-31 作者:daque
作家:岳兵提起icq的学名,喜好电脑的伙伴确定不会感触生疏的吧?icq即是互联网络上的寻寻呼机,不管什么功夫,只有你的伙伴在线,你只需在icq中输出他的id号子,你就不妨在互联网络上呼到他。icq因为其简单、赶快,且具有稠密的备案用户而一举变成互联网络上最时髦的搜集寻寻呼机,它简直变成每一个上钩用户的必备之物。当你在运用icq的功夫,能否会想过本人发端编写一个搜集寻寻呼机呢?这本来在vb中就不妨实行。 搜集传呼的道理即是当存户端步调贯穿效劳器时,经过效劳器探求所要呼唤的id号子,即使检验和测定到此用户且该用户正居于联网状况,则效劳器报告此用户的存户端步调相应主叫方存户端步调,而后在主叫方和被叫方创造贯穿后,两边就不妨谈天或举行其它的通讯。 在vb中编写搜集寻寻呼机须要创造两个步调,一个为存户端步调client,一个为效劳器端步调server。 一、在client工程中创造一个窗体,加载winsock控件,称为tcpclient,和议采用tcp。再介入四个文本框,用以输出效劳器的ip地方、效劳器端标语,被呼唤的搜集传呼id号以及用户登录id号。而后再在窗体中介入三个按钮,辨别定名为“贯穿”、“割断”和“退出”,点击“贯穿”按钮,并举行如次初始化贯穿,代码如次: private sub command1_click() if len(text1.text) = 0 and len(text2.text) = 0 then msgbox ("请输出长机名或长机ip地方。") exit sub elseif len(text1.text) > 0 then tcpclient.remotehost = text1.text tcpclient.remoteport = text2.text end if tcpclient.connect timer1.enabled = true end sub private sub command2_click() tcpclient.close '割断贯穿 end sub private sub command3_click() end end sub private sub form_load() text2.text = "1001" end sub private sub tcpclient_connect() tcpclient.senddata (text3.text&"@"&text4.text) end sub private sub tcpclient_dataarrival(byval bytestotal as long) dim strdata as string tcpclient.getdata strdata strdata = strdata + "呼唤" '在收到呼唤动静后弹出一对话框并表露主叫方id号子 msgbox (strdata) end sub 二、在效劳器端server工程中也创造一个窗体,加载winsock控件,称为tcpserver,和议采用tcp,树立其index值为0,并在工程中增添模块。 实质如次: private type activeuser clientip as string '记载存户的ip地方 clientport as integer '记载暂时对话的端口 clientid as long '记载存户的id号子 clientconnected as boolean '存户贯穿状况,true表白已贯穿,false表白没有贯穿 end type dim curuser() as activeuser dim tcpindex as integer '盯梢暂时创造贯穿数 在form_load事变中介入如次代码: private sub form_load() tcpserver(0).protocol = scktcpprotocol tcpserver(0).localport = 1001 '将 localport 属性树立为一个平头。 tcpserver(0).listen '而后挪用 listen 本领。 tcpindex = 1 end sub 筹备应答存户端步调的乞求贯穿,运用connectionrequest事变来应答户端步调的乞求,代码如次: private sub tcpserver_connectionrequest (index as integer, byval requestid as long) dim i as integer on error goto errhandle for i = 1 to tcpindex '采用一个清闲端口 if curuser(i).clientconnected = false and i <> tcpindex then load tcpserver(i) tcpserver(i).localport = curuser(i).clientport - 1 tcpserver(i).accept requestid exit for elseif curuser(i).clientconnected = false then load tcpserver(i) tcpserver(i).localport = port if tcpserver(i).state <> sckclosed then tcpserver(i).close end if tcpserver(i).accept requestid exit for end if next doevents '尝试贯穿能否胜利 if tcpserver(i).state = sckconnected then if i = tcpindex then '仍旧没有可用端口,记载存户的ip地方和端标语 tcpindex = tcpindex + 1 port = port + 1 redim preserve curuser(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 end if end if exit sub errhandle: resume next '查看控件的 state 属性,如未封闭,在接收新的贯穿之前封闭此贯穿。 if tcpserver(0).state <> sckclosed then tcpserver(0).close tcpserver(0).accept requestid '接收具备 requestid 参数的,贯穿。 end if end sub private sub tcpserver_dataarrival(index as integer, byval bytestotal as long) dim i as integer dim s as string dim requid as long '主叫方id号子 dim searchid as long '被叫方id号子 on error goto errhandle tcpserver(index).getdata s, vbstring '接受数据共存入s if mid(s, i, 1) = "@" then '辨别s中的主叫方和被叫方id号子 searhid = left(s, i - 1) '把号惠存mkey requid = right(s, len(s) - i) 'id惠存requid end if '即使是乞求传呼某一id号子,则检索暂时此id用户能否登录(即curuser数组中能否生存此用户),而后发送消息,报告此用户相应呼唤并表露主叫用户id号子。 for i = 1 to tcpindex if requid = curuser(i).clientid and curuser(i) .clientconnected = true then tcpserver(i).senddata (searhid) end if next exit sub sub errhandle: if err.number = sckbadstate then '贯穿不精确 curuser(i).clientconnected = false curuser(i).clientip = "" unload tcpserver(i) resume next end if end sub 本步调仅供给了用visual basic 编写搜集传呼的思绪和重要局部的实行进程,至于主叫方和被叫方创造贯穿后的通讯并未扩充,读者群若有爱好,可在这上面介入简直的实行代码,就不妨给本步调减少更多的功效,真实时谈天,语音对话等。即使在效劳器步调检索到被叫方时,辨别报告两者存户端步调,使主叫方和被叫方径直运用ip地方举行贯穿,则两者的贯穿速率将会有大幅度的普及。