用VB實現(xiàn)聊天討論室和點對點會話

時間:2022-11-17 10:39:00

導語:用VB實現(xiàn)聊天討論室和點對點會話一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

用VB實現(xiàn)聊天討論室和點對點會話

在一個單位內(nèi)部或通過廣域協(xié)議(如X.25)互聯(lián)的行業(yè)內(nèi)部都有幾十或上萬臺計算機互聯(lián),用Intranet雖然可以建立聊天室,但實現(xiàn)點對點實時對話卻比較困難。本人用Winsock和vb自制了一套聊天室和對話系統(tǒng),特拿來供同行們參考。

一·Winsock的主要屬性、事件和方法

Winsock是不可見控件,控件文件名是MSWINSCK.OCX,全稱為Mcirosoftwinsockcontrol,使用時要將此控件調(diào)入工具箱。

1·屬性:①Protocol=0//使用TCP協(xié)議;

②RemoteHost//準備連接遠程機的IP地址

③RemotePort//連接遠程機的IP端口號(1024—65535之間)

④LocalPort//本地機監(jiān)聽IP端口號必須與呼叫機端口號相同

2·方法:①connect//申請連接遠程機

②listen//設置監(jiān)聽

③accept//建立實際連接

④senddata//發(fā)送數(shù)據(jù)

⑤getdata//接收數(shù)據(jù)

⑥close//關閉連接

3·事件:①connectionrequest//一方請求連接時另一方產(chǎn)生

②connect//一方機接受連接時另一方產(chǎn)生

③close//一方機關閉連接時另一方產(chǎn)生

④dataArrival//一方發(fā)送數(shù)據(jù)另一方產(chǎn)生

⑤error//請求連接失敗時產(chǎn)生

二·制作方法

⑴在一工程中添加兩個表單form1(模擬客戶端)、form2(模擬服務器端)。

form1中裝入控件:

控件名

主要屬性

用途

VB.Formform1

caption=”雷萌聊天室”

controlbox=0‘False

模擬客戶機表單

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”‘任定默認地址

放入常用的地址

mandbuttoncomm1

caption=”退出”

最小化form1

mandbuttoncomm2

caption=”連接”

請求與輸入的地址連接

mandbuttonsend

caption=”發(fā)送”

發(fā)送Text1中的內(nèi)容

VB.Labellabel1

caption=“請在此輸入發(fā)表的信息”

Text1的框標

VB.Labellabel2

caption=“聊天室或?qū)Ψ降男畔ⅰ?/p>

Text2的框標

VB.Labellabel3

caption=”等待連接”

顯示連接狀態(tài)信息

VB.Labellabel4

caption=”聊天室或?qū)Ψ降刂贰?/p>

用于指示Combo1

VB.Labellabel5

caption=”操作:選地址連接,連接成功看到聊天室內(nèi)容后再輸信息發(fā)送”

操作說明

VB.Timertimer1

interval=6000;enabled=false

防止連接超時

MSWinsocklib.winsocka

用于數(shù)據(jù)傳輸

form2中裝入控件:

控件名

主要屬性

用途

VB.Formform2

caption=”接收信息”

controlbox=0‘False

模擬客戶機表單

mandbuttoncommand1

caption=”返回”

隱含F(xiàn)orm2窗口

mandbuttoncommand2

caption=”對話”

點對點會話時用此直接啟動Form1

VB.Textboxtext1

locked=-1‘True

multiline=-1‘True

scrollbars=3‘Bath

存放聊天或?qū)υ拑?nèi)容

VB.Labellabel1

caption=”接收的信息”

Text1的框標

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="你是今天第一個進入本聊天室的客戶。"+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)絡連接失敗!"

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,"退出系統(tǒng)")=6Then

End

Else

Form1.WindowState=1

EndIf

EndSub

PrivateSubForm_Load()

IfApp.PrevInstanceThen

MsgBox"本系統(tǒng)已經(jīng)加載,請看任務攔!",48,"提示"

End

EndIf

flag=False

LoadForm2‘讀入form2進入監(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)絡連接失敗(超時)!"

Label3.Caption="等待連接"

Combo1.Enabled=True

Combo1.SetFocus

a.Close

Comm2.Caption="連接"

EndSub

⑶在Form2的各控件事件中加入如下代碼:

Constmaxn=200‘最大同時連接本機的客戶數(shù)

Dimuser(maxn)AsBoolean

PrivateSubCommand1_Click()

Form2.Hide

EndSub

PrivateSubCommand2_Click()

LoadForm1

Form1.Show

EndSub

PrivateSubForm_Load()

Dimstr1AsString

Form2.Caption="雷萌通信軟件"

注釋:winsock控件a作為服務器程序監(jiān)聽

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注釋:發(fā)送數(shù)據(jù)

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

三·運行

本程序在VB6.0中編譯通過,運行后最小化到任務欄上,也可以用API的Shell_Notifyicon函數(shù)做入右下角的指示器欄中常駐內(nèi)存。你可以在網(wǎng)絡中用一個固定的機器地址作為聊天討論室,其他用戶都選該機地址連接進入該室聊天或討論。各用戶也可選各自熟悉的地址進行連接對話,雙擊form1空白處從內(nèi)存中撤出系統(tǒng)。根據(jù)同樣的原理可以制作電子郵件系統(tǒng)。