用VB實(shí)現(xiàn)聊天討論室和點(diǎn)對(duì)點(diǎn)會(huì)話
時(shí)間:2022-11-17 10:39:00
導(dǎo)語(yǔ):用VB實(shí)現(xiàn)聊天討論室和點(diǎn)對(duì)點(diǎn)會(huì)話一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
在一個(gè)單位內(nèi)部或通過廣域協(xié)議(如X.25)互聯(lián)的行業(yè)內(nèi)部都有幾十或上萬(wàn)臺(tái)計(jì)算機(jī)互聯(lián),用Intranet雖然可以建立聊天室,但實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)對(duì)話卻比較困難。本人用Winsock和vb自制了一套聊天室和對(duì)話系統(tǒng),特拿來供同行們參考。
一·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ā)來的信息
boboxcombo1
text=”10.84.234.11”‘任定默認(rèn)地址
放入常用的地址
mandbuttoncomm1
caption=”退出”
最小化form1
mandbuttoncomm2
caption=”連接”
請(qǐng)求與輸入的地址連接
mandbuttonsend
caption=”發(fā)送”
發(fā)送Text1中的內(nèi)容
VB.Labellabel1
caption=“請(qǐng)?jiān)诖溯斎氚l(fā)表的信息”
Text1的框標(biāo)
VB.Labellabel2
caption=“聊天室或?qū)Ψ降男畔ⅰ?/p>
Text2的框標(biāo)
VB.Labellabel3
caption=”等待連接”
顯示連接狀態(tài)信息
VB.Labellabel4
caption=”聊天室或?qū)Ψ降刂贰?/p>
用于指示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ī)表單
mandbuttoncommand1
caption=”返回”
隱含F(xiàn)orm2窗口
mandbuttoncommand2
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)行
本程序在VB6.0中編譯通過,運(yùn)行后最小化到任務(wù)欄上,也可以用API的Shell_Notifyicon函數(shù)做入右下角的指示器欄中常駐內(nèi)存。你可以在網(wǎng)絡(luò)中用一個(gè)固定的機(jī)器地址作為聊天討論室,其他用戶都選該機(jī)地址連接進(jìn)入該室聊天或討論。各用戶也可選各自熟悉的地址進(jìn)行連接對(duì)話,雙擊form1空白處從內(nèi)存中撤出系統(tǒng)。根據(jù)同樣的原理可以制作電子郵件系統(tǒng)。