用Winsock制作一套聊天室和對話系統 |
發布時間: 2012/6/24 15:13:59 |
·Winsock的主要屬性、事件和方法 Winsock是不可見控件,控件文件名是MSWINSCK.OCX,全稱為Mcirosoftwinsockcontrol,使用時要將此控件調入工具箱。 1·屬性:①Protocol=0//使用TCP協議; ②RemoteHost//準備連接遠程機的IP地址 ③RemotePort//連接遠程機的IP端口號(1024—65535之間) ④LocalPort//本地機監聽IP端口號必須與呼叫機端口號相同 2·方法:①connect//申請連接遠程機 ②listen//設置監聽 ③accept//建立實際連接 ④senddata//發送數據 ⑤getdata//接收數據 ⑥close//關閉連接 3·事件:①connectionrequest//一方請求連接時另一方產生 ②connect//一方機接受連接時另一方產生 ③close//一方機關閉連接時另一方產生 ④dataArrival//一方發送數據另一方產生 ⑤error//請求連接失敗時產生 二·制作方法 ⑴在一工程中添加兩個表單form1(模擬客戶端)、form2(模擬服務器端)。 form1中裝入控件: 控件名 主要屬性 用途 VB.Formform1 caption=”雷萌聊天室” controlbox=0‘False 模擬客戶機表單 VB.Textboxtext1 multiline=-1‘True scrollbars=3‘Bath 用于輸入發往聊天室的信息 VB.Textboxtext2 locked=-1‘True multiline=-1‘True scrollbars=3‘Bath 顯示從聊天室發來的信息 VB.Comboboxcombo1 text=”10.84.234.11”‘任定默認地址 放入常用的地址 VB.Commandbuttoncomm1 caption=”退出” 最小化form1 VB.Commandbuttoncomm2 caption=”連接” 請求與輸入的地址連接 VB.Commandbuttonsend caption=”發送” 發送Text1中的內容 VB.Labellabel1 caption=“請在此輸入發表的信息” Text1的框標 VB.Labellabel2 caption=“聊天室或對方的信息” Text2的框標 VB.Labellabel3 caption=”等待連接” 顯示連接狀態信息 VB.Labellabel4 caption=”聊天室或對方地址” 用于指示Combo1 VB.Labellabel5 caption=”操作:選地址連接,連接成功看到聊天室內容后再輸信息發送” 操作說明 VB.Timertimer1 interval=6000;enabled=false 防止連接超時 MSWinsocklib.winsocka 用于數據傳輸 form2中裝入控件: 控件名 主要屬性 用途 VB.Formform2 caption=”接收信息” controlbox=0‘False 模擬客戶機表單 VB.Commandbuttoncommand1 caption=”返回” 隱含Form2窗口 VB.Commandbuttoncommand2 caption=”對話” 點對點會話時用此直接啟動Form1 VB.Textboxtext1 locked=-1‘True multiline=-1‘True scrollbars=3‘Bath 存放聊天或對話內容 VB.Labellabel1 caption=”接收的信息” Text1的框標 MSWinsocklib.Winsocka 用于監聽 MSWinsocklib.Winsockb 用于傳送聊天信息 ⑵在Form1的各控件事件中加入如下代碼: DimflagAsBoolean注釋:連接狀態變量 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="你是今天第一個進入本聊天室的客戶。" 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"網絡連接失敗!" Label3.Caption="等待連接" Combo1.Enabled=True Combo1.SetFocus a.Close Comm2.Caption="連接" EndSub PrivateSubComm1_Click() a.Close注釋:關閉連接 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("關閉本聊天室!確認嗎?",36,"退出系統")=6Then End Else Form1.WindowState=1 EndIf EndSub PrivateSubForm_Load() IfApp.PrevInstanceThen MsgBox"本系統已經加載,請看任務攔!",48,"提示" End EndIf flag=False LoadForm2‘讀入form2進入監聽 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"網絡連接失敗(超時)!" Label3.Caption="等待連接" Combo1.Enabled=True Combo1.SetFocus a.Close Comm2.Caption="連接" EndSub ⑶在Form2的各控件事件中加入如下代碼: Constmaxn=200‘最大同時連接本機的客戶數 Dimuser(maxn)AsBoolean PrivateSubCommand1_Click() Form2.Hide EndSub PrivateSubCommand2_Click() LoadForm1 Form1.Show EndSub PrivateSubForm_Load() Dimstr1AsString Form2.Caption="雷萌通信軟件" 注釋:winsock控件a作為服務器程序監聽 a.LocalPort=3000 a.Listen EndSub PrivateSuba_ConnectionRequest(ByValrequestIDAsLong) DimiAsLong Fori=1Tomaxn‘當一客戶請求時給啟動一Winsock控件標志號 IfNotuser(i)Then user(i)=True ExitFor EndIf Nexti Ifi>maxnThen ExitSub EndIf Loadb(i)‘當一客戶請求時啟動一Winsock控件 b(i).AcceptrequestID注釋:實際建立連接 IfText1.Text=""Then注釋:發送數據 b(i).SendDataChr(0) Else b(i).SendDataText1.Text EndIf Form2.Show EndSub PrivateSubs_Close(IndexAsInteger) b(Index).Close注釋:關閉連接 Unloadb(Index)注釋:卸載一個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 三·運行 本文出自:億恩科技【www.laynepeng.cn】 |