版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
用WINSOCK控件編寫聊天程序在工具箱中增加Winsock控件,選中“MicrosoftWinsockControl6.0”1、設(shè)計Tcp服務(wù)器程序在窗體中加入一個Winsock控件,取名WinsockfwqTxtfs (發(fā)送)文本框Txtjs (接收)文本框Cmdexit (退出)按鈕PrivateSubCmdexit_click()EndEndSndPrivateSubForm_Load()Txtfs.Visible=FalseTxtjs.Visible=FalseWinsockfwq.LocalPort=1001Winsockfwq.ListenEndSubPrivateSubTxtfs_Change()Winsockfwq.sendDataTxtfs.TextEndSubPrivateSubWinsockfwq_Close()Winsockfwq.CloseEndEndSubPrivateSubWinsockfwq_ConnectionRequest(ByvalrequestldAsLong)Txtfs.Visible=TrueTxtjs.Visible=TrueIfWinsockfwq.StateoSckclosedThenWinsockfwq.closeWinsockfwq.AcceptrequestedEndSubPrivateSubWinsockfwq_DataArrival(ByvalbytesTotalAsLong)DimtmPstrAsStringWinsockfwq.GetDatatmPstrTxtjs.Text=tmPstrEndSub2、設(shè)計Tcp客戶端程序在窗體中加入Winsock,取名為WinsockkhdTxtzjm (主機(jī)名)文本框Txtfs (發(fā)送)文本框Txtjs (接收)文本框Cmdexit (退出)按鈕Cmdlj (連接)按鈕PrivateSubCmdlj_Click()Winsockkhd.ConnectEndSubPrivateSubCmdexit_Click()EndEndSubPrivateSubForm_Load()Txtfs.Visble=FalseTxtjs.Visible=FalseWinsockkhd.RemotePort=1001Winsockkhd.RemoteHost=n0"EndSubPrivateSubTxtzjm_Change()Winsockkhd.RemoteHost=Txtzjm.TextEndSubPrivateSubTxtfs_Change()Winsockkhd.SendDataTxtfs.TextEndSubPrivateSubWinsockkhd_Close()Winsockkhd.CloseEndEndSubPrivateSubWinsockkhd_DataArrval(ByvalbytesTotalAsLong)DimtmPstrAsStringWinsockkhd.GetDatatmPstrTxtjs.Text=tmPstrEndSubOptionExplicitPrivateIgnoreTextAsBoolean, 各控件說明 ,一名稱 類型 作用 ,frmMainFormCHAT主窗體,Winsock1Winsock連接控件,Label1LabelCONNECTWITHIP標(biāo)簽fLabel2LabelLOCALPORT標(biāo)簽labelsLabelREMOTEPORT標(biāo)簽^xtRemotelPTextBox遠(yuǎn)程IP地址輸入框,txtLocalPortTextBox本地PORT輸入框,txtRemotePortTextBox遠(yuǎn)程PORT輸入框,cmdConnectCommandButton連接CONNECT按鈕*Label4LabelTypeyourtextandhitEntertosendit.標(biāo)簽,Frame^remoteip)FrameREMOTEIP框架,Frame2(hostip)FrameHOSTIP框架,TextlTextBox顯示對方(遠(yuǎn)程主機(jī))發(fā)送的CHAT內(nèi)容fText2TextBox輸入己方(本地主機(jī))要發(fā)送的CHAT內(nèi)容,按ENTER鍵發(fā)送^mdClearCommandButton清空輸入框(TEXT2)和顯示框(TEXT1)中的內(nèi)容,StatusBar1StatusBar狀態(tài)欄'當(dāng)CLEAR按鈕按下時,清空TEXT1和TEXT2中的內(nèi)容PrivateSubcmdClear_Click()Textl=WithText2‘清空輸入框.Text="”'并把焦點置于TEXT2.SetFocusEndWithEndSub?當(dāng)CONNECT按鈕按下時,進(jìn)行以下操作PrivateSubcmdConnect_Click()OnErrorGoToErrHandlerWithWinsockl'設(shè)置RemoteHost屬性.RemoteHost=Trim(txtRemotelP)'設(shè)置RemotePort屬性,RemotePort屬性的值應(yīng)該等于遠(yuǎn)程主機(jī)上的LocalHost屬性的值.RemotePort=Trim(txtRemotePort)localPort屬性的值是不能改變的,必須檢查它是否已經(jīng)被設(shè)置,如果LocalPort屬性為空(沒有被設(shè)置),將其設(shè)為在LocalPort輸入框中輸入的數(shù)值If.LocalPort=EmptyThen.LocalPort=Trim(txtLocalPort)Frame2.Caption=.LocalIP’這是必須的,Bind方法的作用是為控件“保留”?個本地端口,防止被其他用戶調(diào)用。.Bind.LocalPortEndIfEndWith'為了保證使用者不能改變LocalPort的值,將txtLocalPort輸入框鎖定txtLocalPort.Locked=True'在狀態(tài)欄中顯示“正在連接”的狀態(tài)StatusBarl.Panels(1).Text="正在連接'*&Winsockl.RemoteHost&H"“如果連接正常,做以下設(shè)置Framel.Enabled=TrueFrame2.Enabled=TrueLabel4.Visible=TrueText2.SetFocusExitSub’如果在連接過程中出現(xiàn)錯誤,則轉(zhuǎn)向ErrHandler:,并顯示錯誤提示ErrHandler:MsgBox”連接遠(yuǎn)程主機(jī)失敗!”,vbCriticalEndSub'當(dāng)窗體加載時顯示提示信息并在txtRemotelP框中顯示本地主機(jī)的IPPrivateSubForm_Load()ShowtxtRemotelP=Winsockl.LocallPEndSubPrivateSubLabel5_Click()EndSub,接收TEXT2輸入框的按鍵,并做響應(yīng)PrivateSubText2_KeyPress(KeyAsciiAsInteger)'定義變量Last_Line_Feed來記錄最后輸入行的位置StaticLast_Line_FeedAsLong完義New_Line字符串記錄新鍵入的一行文本的內(nèi)容DimNew_LineAsString'如果使用者按下CLEAR按鈕對輸入框內(nèi)容清空,這時TEXT2為空,則重設(shè)最后輸入行的位置為0IfTrim(Text2)=vbNullStringThenLast_Line_Feed=0'當(dāng)使用者按下ENTER鍵時IfKeyAscii=13Then'取得最后輸入行的內(nèi)容并賦值給New_Line字符串New_Line=Mid(Text2,Last_Line_Feed+1)'重設(shè)最后輸入行的位置Last_Line_Feed=Text2.SelStart,通過WINSOCK發(fā)送新輸入的一行文本的內(nèi)容Winsockl.SendDataNew_Line'在狀態(tài)欄顯示發(fā)送信息StatusBar1.Panels(2).Text="發(fā)送"&(LenB(New_Line)/2)&H字節(jié)”EndIfEndSubPrivateSubtxtRemotelP_Change()EndSub?當(dāng)WINSOCK接收到新的數(shù)據(jù)(信息)時,進(jìn)行以下響應(yīng)PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong),定義New_Text字符串來記錄新接收的信息DimNew_TextAsString'接收信息并賦值給New_TextWinsockl.GetDataNew_Text,在TEXT1顯示框中顯示新接收到的信息Text1.SelText=New_TextFramel.Caption=Winsockl.RemoteHostIP’在狀態(tài)欄中顯示接收信息StatusBar1.Panels(2).Text="接收到"&bytesTotal&”字節(jié)”EndSub用VB實現(xiàn)聊天討論室和點對點會話在一個單位內(nèi)部或通過廣域協(xié)議(如X.25)互聯(lián)的行業(yè)內(nèi)部都有幾十或上萬臺計算機(jī)互聯(lián),用Intranet雖然可以建?聊天室,但實現(xiàn)點對點實時對話卻比較困難。本人用Winsock和VB自制了一套聊天室和對話系統(tǒng),特拿來供同行們參考。?Winsock的主要屬性、事件和方法Winsock是不可見控件,控件文件名是MSWINSCK.OCX,全稱為Mcirosoftwinsskcontrol,使用時要將此控件調(diào)入工具箱。1?屬性:①Protocol=0〃使用TCP協(xié)議:②RemoteHost〃準(zhǔn)備連接遠(yuǎn)程機(jī)的IP地址③RemotePort〃連接遠(yuǎn)程機(jī)的IP端口號(1024—65535之間)④LocalPort〃本地機(jī)監(jiān)聽IP端口號必須與呼叫機(jī)端口號相同2?方法:①connect〃申請連接遠(yuǎn)程機(jī)?listen〃設(shè)置監(jiān)聽③accept//建立實際連接@senddata〃發(fā)送數(shù)據(jù)?getdata〃接收數(shù)據(jù)?close〃關(guān)閉連接3?事件:?connectionrequest〃一方請求連接時另一方產(chǎn)生②connect〃一方機(jī)接受連接時另一方產(chǎn)生③close〃?方機(jī)關(guān)閉連接時另?方產(chǎn)生④dataArrival〃一方發(fā)送數(shù)據(jù)另一方產(chǎn)生⑤error〃請求連接失敗時產(chǎn)生二?制作方法⑴在一工程中添加兩個表單form1(模擬客戶端)、form2(模擬服務(wù)器端)。forml中裝入控件:控件名主要屬性用途VB.Formformlcaption』雷萌聊天室”controlbox=01False模擬客戶機(jī)表單VB.Textboxtextlmultiline=-1*Truescrollbars=3'Bath用于輸入發(fā)往聊天室的信息VB.Textboxtext2locked=-14Truemultiline=-1Truescrollbars=3'Bath顯示從聊天室發(fā)來的信息VB.Comboboxcomboltext="1”任定默認(rèn)地址放入常用的地址VB.Commandbuttoncommlcaption="退出”最小化form1VB.Commandbuttoncomm2caption」'連接”請求與輸入的地址連接VB.Commandbuttonsendcaption="發(fā)送”發(fā)送Textl中的內(nèi)容VB.Labellabel1caption="請在此輸入發(fā)表的信息”Textl的框標(biāo)VB.LabelIabel2caption=%W天室或?qū)Ψ降男畔ⅰ盩ext2的框標(biāo)VB.LabelIabel3caption=”等待連接”顯示連接狀態(tài)信息VB.LabelIabel4caption="聊天室或?qū)Ψ降刂贰庇糜谥甘綜ombolVB.Labellabelscaptions操作:選地址連接,連接成功看到聊天室內(nèi)容后再輸信息發(fā)送操作說明VB.Timertimeriinterval=6000;enabled=false防止連接超時MSWinsocklib.winsocka用了數(shù)據(jù)傳輸form2中裝入控件:控件名主要屬性用途VB.Formform2caption="接收信息”controlbox=0"False模擬客戶機(jī)表單VB.Commandbuttoncommandlcaption="返回”隱含F(xiàn)orm2窗口VB.Commandbuttoncommand2caption—'對話"點對點會話時用此直接啟動FormlVB.Textboxtext1Iocked=-1*Truemultiline=-1'Truescrollbars=3Bath存放聊天或?qū)υ拑?nèi)容VB.Labellabel1caption="接收的信息”Textl的框標(biāo)MSWinsocklib.Winsocka用于監(jiān)聽MSWinsocklib.Winsockb用于傳送聊天信息⑵在Forml的各控件事件中加入如下代碼:DimflagAsBoolean注釋:連接狀態(tài)變量PrivateSuba_Connect()flag=TruePrivateSuba_DataArrival(ByVaibytesTotalAsLong)DimiAsStringa.GetDataiLabel3.Caption="連接成功!”Comm2.MousePointer=0Forml.MousePointer=0Timeri.Enabled=FalseIfi=Chr(O)ThenText2.Text="你是今天第一個進(jìn)入本聊天室的客戶?!?Chr(13)+Chr(1O)ElseText2.Text=Text2.Text+iEndIfText2.SelStart=Len(Text2.Text)Send.MousePointer=0Combol.Enabled=FalseComm2.Caption="斷開連接〃Textl.SetFocusEndSubPrivateSuba_Error(ByValNumberAsInteger,DescriptionAsString,ByVaiScodeAsLong,ByVaiSourceAsString,ByVaiHelpFileAsString,ByVaiHelpContextAsLong,CancelDisplayAsBoolean)flag=FalseTimeri.Enabled=FalseComm2.MousePointer=0Form1.MousePointer=0MsgBox”網(wǎng)絡(luò)連接失敗!"Label3.Caption=”等待連接”Combol.Enabled=TrueCombol.SetFocusa.CloseComm2.Caption="連接”EndSubPrivateSubComm1_Click()a.Close注釋:關(guān)閉連接Form1.WindowState=1PrivateSubComm2_Click()IfComm2.Caption="斷開連接“Thena.CloseComm2.Caption="連接”Label3.Caption="等待連接"Combol.Enabled=TrueTmerl.Enabled=FalseComm2.MousePointer=0Form1.MousePointer=0ElseText2.7ext="HLabel3.Caption="正在連接Comm2.MousePointer=11Form1.MousePointer=11Timerl.Enabled=Trueflag=Falsea.Protocol=sckTCPProtocola.RemoteHost=Combol.Texta.RemotePort=3000a.ConnectEndIfPrivateSubForm_DblClick()IfMsgBox("關(guān)閉本聊天室!確認(rèn)嗎?”,36,“退出系統(tǒng)")=6ThenEndElseForm1.WindowState=1EndIfEndSubPrivateSubForm_Load()IfApp.PrevInstanceThenMsgBox”本系統(tǒng)已經(jīng)加載,請看任務(wù)攔!”,48,“提示”EndEndIfflag=FalseLoadForm2'讀入form2進(jìn)入監(jiān)聽EndSubPrivateSubSend_Click()DimSAsStringOnErrorGolbffff'防止鏈路中斷Send.MousePointer=11IfRight(lext1.'Text,1)<>Chr(10)ThenS=Textl.lext+Chr(13)+Chr(10)ElseS=Textl.lextEndIfIfflagThena.SendDataSEndIfExitSubffff:MsgBox”連接中斷!*48,“提示“a.CloseSend.MousePointer=0Comm2.Caption=”連接“Label3.Caption="等待連接”Combol.Enabled=TrueComm2.MousePointer=0Form1.MousePointer=0ExitSubEndSubPrivateSubTimeri_7imer()flag=FalseUmerl.Enabled=FalseComm2.MousePointer=0Form1.MousePointer=0MsgBox”網(wǎng)絡(luò)連接失敗(超時)!"Label3.Caption=”等待連接”Combol.Enabled=TrueCombol.SetFocusa.CloseComm2.Caption=〃連接”EndSub⑶在Form2的各控件事件中加入如下代碼:Constmaxn=200'最大同時連接本機(jī)的客戶數(shù)Dimuser(maxn)AsBooleanPrivateSubCommand1_Click()Form2.HideEndSubPrivateSubCommand2_Click()LoadFormlForm1.ShowEndSubPrivateSubForm_Load()Dimstr1AsStringForm2.Caption="雷萌通信軟件”注釋:winsock控件a作為服務(wù)器程序監(jiān)聽a.LocalPort=3000a.ListenEndSubPrivateSuba_ConnectionRequest(ByValrequestIDAsLong)DimiAsLongFori=1lbmaxn'當(dāng)一客戶請求時給啟動-"Winsock控件標(biāo)志號IfNotuser(i)Thenuser(i)=TrueExitForEndIfNextiIfi>maxnThenExitSubLoadb(i)'當(dāng)一客戶請求時啟動一Winsock控件“i).AcceptrequestlD注釋:實際建立連接If詁)(11.詢價=""7116(1注釋:發(fā)送數(shù)據(jù)b(i).SendDataChr(O)Elseb(i).SendDatalextl.lextEndIfForm2.ShowEndSubPrivateSubs_Close(lndexAsInteger)b(lndex).CIose注釋:關(guān)閉連接Unloadb(lndex)注釋:卸載一個WinSock控件user(lndex)=FalseEndSubPrivateSubb_DataArrival(lndexAsInteger,ByVaibyteslbtalAsLong)DimstrAsStringDimiAsLongb(lndex).GetDatastrlextl.lext=lextl.lext+strFori=1lbmaxnIfuser(i)Thenb(i).SendDatastrEndIfNextiEndSub圖1.1系統(tǒng)整體流程VB利用UDP制作簡單的點對點聊天程序收藏VERSION5.00Object=[248DD890-BB45-1ICF-9ABC-0080C7E7B78D}#1.0#0”;nMSWINSCK.OCXMBeginVB.FormfrmMainBorderStyle=1'FixedSingleCaption="點對點聊天”ClientHeight=5175ClientLeft=45ClientTop=360Clientwidth=6720KeyPreview= -1TrueLinkTopic="Forml”LockControls=-1TrueMaxButton=0'FalseScaleHeight=5175ScaleWidth=6720StartUpPosition=2'屏幕中心BeginVB.TimertimerCheckConnectEnabled=0'FalseInterval=10000Left=2160Top=4560EndBeginVB.TextBoxtextSendHeight=1455Left=120MultiLine=-1TrueScrollBars=2VerticalTabindex二4Top=3000Width=6495EndBeginVB.CommandButtoncmdConnectCaption="連接(&C)”Default= -1TrueHeight=375Left=5640Tabindex=2Top=160Width=975EndBeginVB.TextBoxtextPortHeight=270Left=4440
Tabindex=1Text“5300”Top200Width855EndBeginMSWinsockLib.WinsockwskLeft1320Top4680_ExtentX741_ExtentY741_Version393216EndBeginVB.CommandButtoncmdExitCancel-1TrueCaption”退出(&X)”Height375Left5640Tabindex6Top4640Width975EndBeginVB.CommandButtoncmdSendCaption”發(fā)送(&S)”Height375Left4680Tabindex5Top4640Width975EndBeginVB.TextBoxtextAddressHeight270Left1440Tabindex0Top200Width1695EndBeginVB.TextBoxtextMessageHeight2175Left120MultiLine-1TrueScrollBars2VerticalTabindex=3Top-680Width6495EndBeginVB.LabelLabel1Caption =”輸入聊天端口:Height =255Left =3240Tabindex =8Top =240Width =1215EndBeginVB.LabelIMsgCaption =”輸入聊天的IP:Height =255Left =120Tabindex =7Top =240Width =1335EndEndAttributeVB_Name=',frmMain,,AttributeVB_GlobalNameSpace=FalseAttributeVB_Creatable=FalseAttributeVB_Predec1aredid=TrueAttributeVB_Exposed=False'發(fā)送消息函數(shù)PrivateDeclareFunctionSendMessageLib"user32'1AliasnSendMessageA"(ByVaihwndAsLong,ByVaiwMsgAsLong,ByVaiwParamAsLong,IParamAsAny)AsLong'使?jié)L動條自動下拉PrivateConstWM_VSCROLL=&H115PrivateConstSB^BOTTOM=7標(biāo)識對方是否在線PrivateisOnlineAsBoolean'動畫窗體(使指定窗體閃動好提示對方有消息來了)PrivateDeclareFunctionFlashWindowLibMuser32M(ByVaihwndAsLong,ByVaiblnvertAsLong)AsLong驗證IP的合法性PrivateDeclareFunctioninet_addrLib"ws2_32.dll"(ByVaicpAsString)AsLong’顯示XP風(fēng)格函數(shù)PrivateDeclareSubInitCommonControlsLib"comctl32.dll"()PrivateSubForm_Initialize()'顯示XP風(fēng)格InitCommonControlsPrivateSubcmdConnect_Click()'IP地址不能為空IftextAddress.Text=,,MThenMsgBox”請輸入對方的IP地址或者計算機(jī)名??!”,vbCrilical,“錯誤”textAddress.SetFocusExitSubElse'當(dāng)是以IP地址連接方式下IfInStr(textAddress.Text,n.n)Then'當(dāng)IP地址不合法Ifinet_addr(textAddress.Text)=-1ThenMsgBox"請檢查你的IP合法性!!",vbCritical,"提示"'選擇輸入的字符串textAddress.SelStart=0textAddress.SelLength=Len(textAddress.Text)textAddress.SetFocusExitSubEndIfEndIfEndIf‘端口不能為空IftextPort.Text=,,nThenMsgBox”請輸入聊天的端口號??!”,vbCritical,“錯誤”textPort.SetFocusExitSubElse,端口必須是數(shù)字IfNotIsNumeric(textPort.Text)ThenMsgBox”請輸入1-65536之間的數(shù)字?。 ?vbCritical,“錯誤”'選擇輸入的字符串textPort.SelStart=0textPort.SeiLength=Len(textPort.Text)textPort.SetFocusExitSubElse'對數(shù)字進(jìn)行驗證IfCLng(textPort.Text)<1AndCLng(textPort.Text)>65536ThenMsgBox”請輸入1-65536之間的數(shù)字!! vbCritical,"錯誤textPort.SetFocusExitSubEndIfEndIfEndIf'連接對方發(fā)送在線消息(在連接前先斷開連接)wsk.Close'指明自己的連接端口wsk.LocalPort=textPort.Text'對方的連接端口wsk.RemotePort=textPort.Text'對方的IP或者計算機(jī)名wsk.RemoteHost=textAddress.Textwsk.Bind'發(fā)送在線消息wsk.SendData"Online**A_A**"&wsk.LocallP'禁用連接按鈕和IP地址欄以及端口textAddress.Enabled=FalsetextPort.Enabled=FalsecmdConnect.Enabled=FalsetimerCheckConnect.Enabled=TrueEndSubPrivateSubcmdExit_Click()UnloadMeEndSubPublicSubcmdSend_Click()DimstrSendAsString'發(fā)送消息給對方IftextSend.Text<>""Then,驗證IP和端口IftextAddress.Text<>""AndtextPort.Texto""Then’判斷是否在線IfisOnlineThenstrSend=ReplaceExceptiveString(textSend.Text)wsk.SendDatastrSend&“**八_八**"&wsk.LocallPtextMessage.Text=textMessage.Text&vbNewLine&wsk.LocallP&”"&Format(Now,nyyyy年-mm月-dd日HH:MM:SSU)&vbNewLine&textSend.TexttextSend.Text=vbNullStringSendMessagetextMessage.hwnd,WM_VSCROLL,SB_BOTTOM,0Else’如果不在線恢復(fù)可用連接狀態(tài)MsgBox”對方不在線上??!”,vbCritical,"提示“cmdConnect.Enabled=TruetextAddress.Enabled=TruetextPort.Enabled=TrueEndIfElseMsgBox”請檢查IP地址和端口號是否合法!!",vbCritical,"提示”ExitSubEndIfEndIfEndSub'替換特殊字符串函數(shù)PrivateFunctionReplaceExceptiveString(ByValstrCheckAsString)AsString'這里替換的字符我用chr(O)因為正常是輸入不了這個字符的IfLeft(strCheck,13)=HOnline**A_A**nThenReplaceExceptiveString=String(8,Chr(0))&Mid(strCheck,14,Len(strCheck)-13)ElselfLeft(strCheck,15)=MOnlineOK**A_A**nThenReplaceExceptiveString=String(10,Chr(O))&Mid(strCheck,16,Len(strCheck)-15)ElselfLeft(strCheck,12)="Leave**A_A**nThenReplaceExceptiveString=String(6,Chr(0))&Mid(strCheck,13,Len(strCheck)-12)ElseRep!aceExceptiveString=strCheckEndIfEndFunction還原特殊字符串函數(shù)PrivateFunctionRestoreExceptiveString(ByVaistrCheckAsString)AsStringIfLeft(strCheck,10)=String(10,Chr(0))ThenRestoreExceptiveString=nOnlineOK**A_A**"&Mid(strCheck,11,Len(strCheck)-10)ElselfLeft(stiCheck,8)=String(8,Chr(O))ThenRestoreExceptiveString="Online**A_A**"&Mid(strCheck,9,Len(strCheck)-8)ElselfLeft(strCheck,6)=String(6,Chr(O))ThenRestoreExceptiveString="Leave**A_A**n&Mid(strCheck,7,Len(strCheck)-6)ElseRestoreExceptiveString=strCheckEndIfEndFunctionPrivateSubForm_Load()hHook=SetWindowsHookEx(WH_KEYBOARD,AddressOfKeyboardProc,App.hlnstance,App.ThreadID)’指定協(xié)議類型為UDPwsk.Protocol=sckUDPProtocol'鎖住信息顯示欄Me.textMessage.Locked=TrueEndSubPrivateSubForm_Unload(CancelAsInteger)UnhookWindowsHookExhHook,當(dāng)退出程序發(fā)送離線消息OnErrorResumeNextwsk.SendData"Leave**A_A**M&wsk.LocallPEndSub檢測對方是否在線PrivateSubtimerCheckConnect_Timer()IfNotisOnlineThenMsgBox”對方不在線,或者是網(wǎng)絡(luò)有問題!!”,vbCritical,“錯誤”'恢復(fù)可連接狀態(tài)textAddress.Enabled=TruetextPort.Enabled=TruecmdConnect.Enabled=TruetimerCheckConnect.Enabled=FalseEndIfEndSub,Winsock消息接收事件PrivateSubwsk_DataArrival(ByVaibytesTotalAsLong)'消息過濾DimstrMessageAsString,strArrayOAsStringOnErrorResumeNext'接收類型為字符串wsk.GetDatastrMessage,vbString'格式化字符串(自定義協(xié)議的時候可以根據(jù)自己的愛好,但是在分割字符串的符號上最好是不要太容易重復(fù)的標(biāo)識以防消息判斷錯誤)strArray=Split(strMessage,"**A_"**")’如果是上線消息IfLeft(strMessage,13)="Online**八_八**"ThenIftextMessage.Texto,,HThentextMessage.Text=textMessage.Text&vbNewLine&strArray(1)&"在"&Format(Now,Hyyyy年?mm月?dd日HH:MM:SSH)&”上線了!!"&vbNewLineElsetextMessage.Text=strArray(l)&"在“&Formal(Now,“yyyy年?mm月?dd日HH:MM:SS")&“上線了?。?&vbNewLineEndIf'給對方發(fā)送你已經(jīng)在線了wsk.SendData,,OnlineOK**A_A**n&wsk.LocallP'設(shè)置處于上線狀態(tài)isOnline=True'關(guān)閉檢測在線記時器timerCheckConnect.Enabled=False'自動下來滾動條SendMessagetextMessage.hwnd,WM_VSCROLL,SB_BOTTOM,0‘扇動窗體好知道有消息來了FlashWindowMe.hwnd,1'禁用連接按鈕和IP地址欄以及端口textAddress.Enabled=FalsetextPort.Enabled=FalsecmdConnect.Enabled=False'接收到對方已經(jīng)在線了ElselfLeft(strMessage,15)="OnlineOK**A_A**HThen'顯示對方已經(jīng)在線了IftextMessage.Text<>ThentextMessage.Text=textMessage.Text&vbNewLine&strArray(l)&"在"&Format(Now,"yyyy年?mm月-dd日HH:MM:SSM)&”上線了!!”&vbNewLineElsetextMessage.Text=strArray(l)&"在"&Formal(Now,"yyyy年?mm月?dd日HH:MM:SSn)&”上線了??!"&vbNewLineEndIf'設(shè)置在線標(biāo)識isOnline=True'關(guān)閉檢測在線記時器timerCheckConnect.Enabled=False'自動下來滾動條SendMessagetextMessage.hwnd,WM_VSCROLL,SB_BOTTOM,0'扇動窗體好知道有消息來了FlashWindowMe.hwnd,1'禁用連接按鈕和IP地址欄以及端口textAddress.Enabled=FalsetextPort.Enabled=FalsecmdConnect.Enabled=FalseElselfLeft(strMessage,12)=nLeave**A_A**HThen'當(dāng)對方離線了IftextMessage.Text<>ThentextMessage.Text=textMessage.Text&vbNewLine&strArray(l)&"在"&Format(Now,"yyyy年-mm月-dd日HH:MM:SSM)&”離線了!!”&vbNewLineElsetextMessage.Text=strArray(l)&"在"&Format(Now,"yyyy年?mm月?dd日HH:MM:SS'*)&”離線了!!”&vbNewLineEndIf'設(shè)置離線標(biāo)識isOnline=False”恢復(fù)可連接狀態(tài)textAddress.Enabled=TruetextPort.Enabled=TruecmdConnect.Enabled=True'自動下來滾動條SendMessagetextMessage.hwnd,WM_VSCROLL,SB.BOTTOM,0‘扇動窗體好知道有消息來了FlashWindowMe.hwnd,1Else',般聊天內(nèi)容textMessage.Text=textMessage.Text&vbNewLine&strArray(l)&0"&Format(Now,uyyyy年?mm月-dd日HH:MM:SS'*)&vbNewLine&RestoreExceptiveString(strArray(O))&vbNewLine'自動下來滾動條SendMessagetextMessage.hwnd,WM_VSCROLL,SB_BOTTOM,0‘扇動窗體好知道有消息來了FlashWindowMe.hwnd,1EndIfEndSubPrivateSubwsk_Error(ByVaiNumberAsInteger,DescriptionAsString,ByVaiScodeAsLong,ByVaiSourceAsString,ByVaiHelpFileAsString,ByVaiHelpContextAsLong,CancelDisplayAsBoolean)'當(dāng)有錯誤產(chǎn)生顯示錯誤信息MsgBoxDescription“恢復(fù)可連接狀態(tài)textAddress.Enabled=TruetextPort.Enabled=TruecmdConnect.Enabled=TrueEndSubAttributeVB_Name=umodKeyBoard"OptionExplicitPrivateConstWM_KEYDOWN=&H100PrivateConstWM_KEYUP=&H101PrivateConstWM_SYSKEYDOWN=&H104PrivateConstWM_SYSKEYUP=&HiO5PublicConstWH_KEYBOARD=2PrivateConstVK_CONTROL=&H11DeclareFunctionCallNextHookExLib,,user32n(ByVaihHookAsLong,ByVaincodeAsLong,ByVaiwParamAsLong,1ParamAsAny)AsLongDeclareFunctionGetKeyStateLib,,user32,'(ByVainVirtKeyAsLong)AsIntegerDeclareFunctionSetWindowsHookExLib"user32"AliasMSetWindowsHookExAu(ByVaiidHookAsLong,ByVaiIpfnAsLong,ByVaihmodAsLong,ByVaidwThreadldAsLong)AsLongDeclareFunctionUnhookWindowsHookExLib,,user32n(ByVaihHookAsLong)AsLongPublichHookAsLongPublicFunctionKeyboardProc(ByValidHookAsLong,ByVaiwParamAsLong,ByVai1ParamAsLong)AsLongIfidHook<0ThenKeyboardProc=CallNextHookEx(hHook,idHook,wParam,ByVai1Param)ElseIf(GetKeyState(VK_CONTROL)And&H8000)AndwParam=13ThenIffrmMain.textSend.Text<>nnThenfrmMain.cmdSend_ClickKeyboardProc=1ExitFunctionEndIfKeyboardProc=CallNextHookEx(hHook,idHook,wParam,ByVaiIParam)EndIfEndFunction本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處/chenhui530/archive/2007/10/01/1809130.aspxL屬性:①Protocol:。//使用TCP協(xié)議②R6moteHost〃準(zhǔn)備連接遠(yuǎn)程機(jī)的IP地址③RemotePorW連接遠(yuǎn)程機(jī)的1P端口號(1024—65535之間)④LocalPort//本地機(jī)監(jiān)聽IP端口號必須與呼叫機(jī)端口號相同2?方法:①connect〃申請連接遠(yuǎn)程機(jī)②listen//設(shè)置監(jiān)聽③accept//建立實際連接④senddata//發(fā)送數(shù)據(jù)⑤geldata//接收數(shù)據(jù)⑥close〃關(guān)閉連接3?事件:①connectionrequest//一方請求連接時另一方產(chǎn)生②connect//一方機(jī)接受連接時另一方產(chǎn)生③close//一方機(jī)關(guān)閉連接時另一方產(chǎn)生④dataArrival//力發(fā)送數(shù)據(jù)另方產(chǎn)生⑤error〃請求連接失敗時產(chǎn)生二?制作方法⑴在工程中添加兩個表單forml(模擬客戶端)、form2(模擬服務(wù)器端)。forml中裝入控件:控件名主要屬性用途VB.Formformlcaption:”雷萌聊天室”controlbox=04False模擬客戶機(jī)表單VB.lextboxtextlmultilinearTruescrollbars=3kBath用于輸入發(fā)往聊天室的信息VB.Textboxtext2locked=-1Truemultiline=-rTruescrollbars=3*Bath顯示從聊天室發(fā)來的信息VB.Comboboxcombo1texl="L任定默認(rèn)地址放入常用的地址VB.Commandbuttoncomm1caption退出”最小化formlVB.Commandbultoncomm2caption一連接”請求與輸入的地址連接VB.Commandbuttonsendcapiion="發(fā)送”發(fā)送lextl中的內(nèi)容VB.Labellabel1caption=”請在此輸入發(fā)表的信息”Textl的框標(biāo)VB.Labellabel2caption="JP天室或?qū)Ψ降男畔ⅰ盩ext2的框標(biāo)VB.Labellabel3caption=”等待連接”顯示連接狀態(tài)信息VB.Labellabel4caption="聊天室或?qū)Ψ降刂贰庇糜谥甘綜ombo1VB.Labellabel5caption="操作:選地址連接,連接成功看到聊天室內(nèi)容后再輸信息發(fā)送”操作說明VB.Timertimcrlinterval=6000;enabled=false防止連接超時MSWinsocklib.winsocka用于數(shù)據(jù)傳輸form2中裝入控件:控件名主要屬性用途VB.Formform2caption="接收信息”controlbox=()kFalse模擬客戶機(jī)表單VB.Commandbuttoncommand1caplion="返回”隱含F(xiàn)orm2窗口VB.Commandbuttoncommand2caplion="對話"點對點會話時用此直接啟動FormlVB.Textboxtext1locked=-14Truemultiline=-riruescrollbars=3kBath存放聊天或?qū)υ拑?nèi)容VB.Labcllabcllcaption="接收的信息”Text)的框標(biāo)MSWinsocklib.Winsocka用于監(jiān)聽MSWinsocklib.Winsockb用于傳送聊天信息⑵在Forml的各控件事件中加入如下代碼:DimflagAsBoolean注釋:連接狀態(tài)變量PrivateSuba_Connect()flag=TrueEndSubPrivateSuba_DataArrival(ByValbytesrR)talAsLong)DimiAsStringa.GetDataiLabel3.Caption="連接成功!"Comm2.MousePointer=0Form1.MousePointer=0TimerI.Enabled=FalseIfi=Chr(O)ThenText2.1bxt="你是今天第一個進(jìn)入本聊天室的客戶?!盋hr(13)ChitlO)ElseText2.1ext=Text2.1extiEndlfText2.SelStart=Len(rIext2.1ext)Scnd.MouscPointer=0Combol.Enabled=FalseComm2.Caption="斷開連接”Textl.SetFocusEndSubPrivateSuba_Error(ByValNumberAsInteger,DescriptionAsString,ByValScodeAsLong,ByValSourceAsString,ByValHelpFileAsString,ByValHelpContextAsLong,CancelDisplayAsBoolean)flag=F
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國LED散熱器行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略咨詢報告
- 2024-2026年中國GPS接收機(jī)市場供需現(xiàn)狀及投資戰(zhàn)略研究報告
- 2025年樹脂透明齒拉鏈行業(yè)深度研究分析報告
- 2019-2025年中國抗腫瘤原料藥市場行情動態(tài)分析及發(fā)展前景趨勢預(yù)測報告
- 2025年中國舉升機(jī)行業(yè)發(fā)展全景監(jiān)測及投資方向研究報告
- 2025年雞價行業(yè)深度研究分析報告
- 課程設(shè)計小姐姐壁紙
- 2025-2030年中國5G信號分析儀行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 顏色派對課程設(shè)計思路
- 2023-2028年中國空心膠囊行業(yè)市場全景評估及投資戰(zhàn)略研究報告
- 春節(jié)文化常識單選題100道及答案
- 12123交管學(xué)法減分考試題及答案
- 2024年杭州師范大學(xué)附屬醫(yī)院招聘高層次緊缺專業(yè)人才筆試真題
- 制造業(yè)BCM業(yè)務(wù)連續(xù)性管理培訓(xùn)
- 商場停車場管理制度
- 24年追覓在線測評28題及答案
- TGDNAS 043-2024 成人靜脈中等長度導(dǎo)管置管技術(shù)
- 《陸上風(fēng)電場工程概算定額》NBT 31010-2019
- 皮帶輸送機(jī)工程施工電氣安裝措施要點
- 藥房(冰柜)溫濕度表
- QJ903.9A-1995航天產(chǎn)品工藝文件管理制度管理用工藝文件編制規(guī)則
評論
0/150
提交評論