用Winsock制作一套聊天室和對(duì)話系統(tǒng) |
發(fā)布時(shí)間: 2012/6/24 15:13:59 |
·Winsock的主要屬性、事件和方法 Winsock是不可見控件,控件文件名是MSWINSCK.OCX,全稱為Mcirosoftwinsockcontrol,使用時(shí)要將此控件調(diào)入工具箱。 1·屬性:①Protocol=0//使用TCP協(xié)議; ②RemoteHost//準(zhǔn)備連接遠(yuǎn)程機(jī)的IP地址 ③RemotePort//連接遠(yuǎn)程機(jī)的IP端口號(hào)(1024—65535之間) ④LocalPort//本地機(jī)監(jiān)聽I(yíng)P端口號(hào)必須與呼叫機(jī)端口號(hào)相同 2·方法:①connect//申請(qǐng)連接遠(yuǎn)程機(jī) ②listen//設(shè)置監(jiān)聽 ③accept//建立實(shí)際連接 ④senddata//發(fā)送數(shù)據(jù) ⑤getdata//接收數(shù)據(jù) ⑥close//關(guān)閉連接 3·事件:①connectionrequest//一方請(qǐng)求連接時(shí)另一方產(chǎn)生 ②connect//一方機(jī)接受連接時(shí)另一方產(chǎn)生 ③close//一方機(jī)關(guān)閉連接時(shí)另一方產(chǎn)生 ④dataArrival//一方發(fā)送數(shù)據(jù)另一方產(chǎn)生 ⑤error//請(qǐng)求連接失敗時(shí)產(chǎn)生 二·制作方法 ⑴在一工程中添加兩個(gè)表單form1(模擬客戶端)、form2(模擬服務(wù)器端)。 form1中裝入控件: 控件名 主要屬性 用途 VB.Formform1 caption=”雷萌聊天室” controlbox=0‘False 模擬客戶機(jī)表單 VB.Textboxtext1 multiline=-1‘True scrollbars=3‘Bath 用于輸入發(fā)往聊天室的信息 VB.Textboxtext2 locked=-1‘True multiline=-1‘True scrollbars=3‘Bath 顯示從聊天室發(fā)來的信息 VB.Comboboxcombo1 text=”10.84.234.11”‘任定默認(rèn)地址 放入常用的地址 VB.Commandbuttoncomm1 caption=”退出” 最小化form1 VB.Commandbuttoncomm2 caption=”連接” 請(qǐng)求與輸入的地址連接 VB.Commandbuttonsend caption=”發(fā)送” 發(fā)送Text1中的內(nèi)容 VB.Labellabel1 caption=“請(qǐng)?jiān)诖溯斎氚l(fā)表的信息” Text1的框標(biāo) VB.Labellabel2 caption=“聊天室或?qū)Ψ降男畔?rdquo; Text2的框標(biāo) VB.Labellabel3 caption=”等待連接” 顯示連接狀態(tài)信息 VB.Labellabel4 caption=”聊天室或?qū)Ψ降刂?rdquo; 用于指示Combo1 VB.Labellabel5 caption=”操作:選地址連接,連接成功看到聊天室內(nèi)容后再輸信息發(fā)送” 操作說明 VB.Timertimer1 interval=6000;enabled=false 防止連接超時(shí) MSWinsocklib.winsocka 用于數(shù)據(jù)傳輸 form2中裝入控件: 控件名 主要屬性 用途 VB.Formform2 caption=”接收信息” controlbox=0‘False 模擬客戶機(jī)表單 VB.Commandbuttoncommand1 caption=”返回” 隱含F(xiàn)orm2窗口 VB.Commandbuttoncommand2 caption=”對(duì)話” 點(diǎn)對(duì)點(diǎn)會(huì)話時(shí)用此直接啟動(dòng)Form1 VB.Textboxtext1 locked=-1‘True multiline=-1‘True scrollbars=3‘Bath 存放聊天或?qū)υ拑?nèi)容 VB.Labellabel1 caption=”接收的信息” Text1的框標(biāo) MSWinsocklib.Winsocka 用于監(jiān)聽 MSWinsocklib.Winsockb 用于傳送聊天信息 ⑵在Form1的各控件事件中加入如下代碼: DimflagAsBoolean注釋:連接狀態(tài)變量 PrivateSuba_Connect() flag=True EndSub PrivateSuba_DataArrival(ByValbytesTotalAsLong) DimiAsString a.GetDatai Label3.Caption="連接成功!" Comm2.MousePointer=0 Form1.MousePointer=0 Timer1.Enabled=False Ifi=Chr(0)Then Text2.Text="你是今天第一個(gè)進(jìn)入本聊天室的客戶。" Chr(13) Chr(10) Else Text2.Text=Text2.Text i EndIf Text2.SelStart=Len(Text2.Text) Send.MousePointer=0 Combo1.Enabled=False Comm2.Caption="斷開連接" Text1.SetFocus EndSub PrivateSuba_Error(ByValNumberAsInteger,DescriptionAsString,ByValScodeAsLong,ByValSourceAsString,ByValHelpFileAsString,ByValHelpContextAsLong,CancelDisplayAsBoolean) flag=False Timer1.Enabled=False Comm2.MousePointer=0 Form1.MousePointer=0 MsgBox"網(wǎng)絡(luò)連接失。" Label3.Caption="等待連接" Combo1.Enabled=True Combo1.SetFocus a.Close Comm2.Caption="連接" EndSub PrivateSubComm1_Click() a.Close注釋:關(guān)閉連接 Form1.WindowState=1 EndSub PrivateSubComm2_Click() IfComm2.Caption="斷開連接"Then a.Close Comm2.Caption="連接" Label3.Caption="等待連接" Combo1.Enabled=True Timer1.Enabled=False Comm2.MousePointer=0 Form1.MousePointer=0 Else Text2.Text="" Label3.Caption="正在連接.." Comm2.MousePointer=11 Form1.MousePointer=11 Timer1.Enabled=True flag=False a.Protocol=sckTCPProtocol a.RemoteHost=Combo1.Text a.RemotePort=3000 a.Connect EndIf EndSub PrivateSubForm_DblClick() IfMsgBox("關(guān)閉本聊天室!確認(rèn)嗎?",36,"退出系統(tǒng)")=6Then End Else Form1.WindowState=1 EndIf EndSub PrivateSubForm_Load() IfApp.PrevInstanceThen MsgBox"本系統(tǒng)已經(jīng)加載,請(qǐng)看任務(wù)攔!",48,"提示" End EndIf flag=False LoadForm2‘讀入form2進(jìn)入監(jiān)聽 EndSub PrivateSubSend_Click() DimSAsString OnErrorGoToffff‘防止鏈路中斷 Send.MousePointer=11 IfRight(Text1.Text,1)<>Chr(10)Then S=Text1.Text Chr(13) Chr(10) Else S=Text1.Text EndIf IfflagThen a.SendDataS EndIf ExitSub ffff: MsgBox"連接中斷!",48,"提示" a.Close Send.MousePointer=0 Comm2.Caption="連接" Label3.Caption="等待連接" Combo1.Enabled=True Comm2.MousePointer=0 Form1.MousePointer=0 ExitSub EndSub PrivateSubTimer1_Timer() flag=False Timer1.Enabled=False Comm2.MousePointer=0 Form1.MousePointer=0 MsgBox"網(wǎng)絡(luò)連接失敗(超時(shí))!" Label3.Caption="等待連接" Combo1.Enabled=True Combo1.SetFocus a.Close Comm2.Caption="連接" EndSub ⑶在Form2的各控件事件中加入如下代碼: Constmaxn=200‘最大同時(shí)連接本機(jī)的客戶數(shù) Dimuser(maxn)AsBoolean PrivateSubCommand1_Click() Form2.Hide EndSub PrivateSubCommand2_Click() LoadForm1 Form1.Show EndSub PrivateSubForm_Load() Dimstr1AsString Form2.Caption="雷萌通信軟件" 注釋:winsock控件a作為服務(wù)器程序監(jiān)聽 a.LocalPort=3000 a.Listen EndSub PrivateSuba_ConnectionRequest(ByValrequestIDAsLong) DimiAsLong Fori=1Tomaxn‘當(dāng)一客戶請(qǐng)求時(shí)給啟動(dòng)一Winsock控件標(biāo)志號(hào) IfNotuser(i)Then user(i)=True ExitFor EndIf Nexti Ifi>maxnThen ExitSub EndIf Loadb(i)‘當(dāng)一客戶請(qǐng)求時(shí)啟動(dòng)一Winsock控件 b(i).AcceptrequestID注釋:實(shí)際建立連接 IfText1.Text=""Then注釋:發(fā)送數(shù)據(jù) b(i).SendDataChr(0) Else b(i).SendDataText1.Text EndIf Form2.Show EndSub PrivateSubs_Close(IndexAsInteger) b(Index).Close注釋:關(guān)閉連接 Unloadb(Index)注釋:卸載一個(gè)WinSock控件 user(Index)=False EndSub PrivateSubb_DataArrival(IndexAsInteger,ByValbytesTotalAsLong) DimstrAsString DimiAsLong b(Index).GetDatastr Text1.Text=Text1.Text str Fori=1Tomaxn Ifuser(i)Then b(i).SendDatastr EndIf Nexti EndSub 三·運(yùn)行 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |