程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 用Winsock制作一套聊天室和對話系統

用Winsock制作一套聊天室和對話系統

編輯:VB綜合教程
在一個單位內部或通過廣域協議(如X.25)互聯的行業內部都有幾十或上萬台計算機互聯,用Intranet雖然可以建立聊天室,但實現點對點實時對話卻比較困難。本人用Winsock和VB自制了一套聊天室和對話系統,特拿來供同行們參考。
  
  一·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
  
  三·運行
  
  本程序在VB6.0中編譯通過,運行後最小化到任務欄上,也可以用API的Shell_Notifyicon函數做入右下角的指示器欄中常駐內存。你可以在網絡中用一個固定的機器地址作為聊天討論室,其他用戶都選該機地址連接進入該室聊天或討論。各用戶也可選各自熟悉的地址進行連接對話,雙擊form1空白處從內存中撤出系統。根據同樣的原理可以制作電子郵件系統。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved