在一個單位內部或通過廣域協議(如X.25)互聯的行業內部都有幾十或上萬台電腦互聯,用Intranet雖然可以建立聊天室,但實現點對點即時對話卻比較困難。本人用Winsock和VB自製了一套聊天室和對話系統,特拿來供同行們參考。


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


Winsock是不可見控制項,控制項檔案名是MSWINSCK.OCX,全稱為Mcirosoft winsock control,使用時要將此控制項調入工具箱。


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.Form form1

caption=”雷萌聊天室”


controlbox=0 ‘False

模擬客戶機表單


VB.Textbox text1

multiline=-1 ‘True


scrollbars=3 ‘Bath

用於輸入發往聊天室的資訊


VB.Textbox text2

locked=-1 ‘True


multiline=-1 ‘True


scrollbars=3 ‘Bath

顯示從聊天室發來的資訊


VB.Combobox combo1

text=”10.84.234.11” ‘任定默認地址

放入常用的地址


VB.Commandbutton comm1

caption=”退出”

最小化form1


VB.Commandbutton comm2

caption=”連接”

請求與輸入的位址連接


VB.Commandbutton send

caption=”發送”

發送Text1中的內容


VB.Label label1

caption=“請在此輸入發表的資訊”

Text1的框標


VB.Label label2

caption=“聊天室或對方的資訊”

Text2的框標


VB.Label label3

caption=”等待連接”

顯示連接狀態資訊


VB.Label label4

caption=”聊天室或對方地址”

用於指示Combo1


VB.Label label5

caption=”操作:選位址連接,連接成功看到聊天室內容後再輸資訊發送”

操作說明


VB.Timer timer1

interval=6000; enabled=false

防止連接超時


MSWinsocklib.winsock a


用於資料傳輸


 


 




form2中裝入控制項:


控制項名

主要屬性

用 途


VB.Form form2

caption=”接收資訊”


controlbox=0 ‘False

模擬客戶機表單


VB.Commandbutton command1

caption=”返回”

隱含Form2窗口


VB.Commandbutton command2

caption=”對話”

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


VB.Textbox text1

locked=-1 ‘True


multiline=-1 ‘True


scrollbars=3 ‘Bath

存放聊天或對話內容


VB.Label label1

caption=”接收的資訊”

Text1的框標


MSWinsocklib.Winsock a


用於監聽


MSWinsocklib.Winsock b


用於傳送聊天資訊


 




? 在Form1的各控制項事件中加入如下代碼:


Dim flag As Boolean '連接狀態變數


 


Private Sub a_Connect()


flag = True


End Sub


 


Private Sub a_DataArrival(ByVal bytesTotal As Long)


Dim i As String


a.GetData i


Label3.Caption = "連接成功!"


Comm2.MousePointer = 0


Form1.MousePointer = 0


Timer1.Enabled = False


If i = Chr(0) Then


Text2.Text = "你是今天第一個進入本聊天室的客戶。" + Chr(13) + Chr(10)


Else


Text2.Text = Text2.Text + i


End If


Text2.SelStart = Len(Text2.Text)


Send.MousePointer = 0


Combo1.Enabled = False


Comm2.Caption = "斷開連接"


Text1.SetFocus


End Sub


 


Private Sub a_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)


flag = False


Timer1.Enabled = False


Comm2.MousePointer = 0


Form1.MousePointer = 0


MsgBox "網路連接失敗 !"


Label3.Caption = "等待連接"


Combo1.Enabled = True


Combo1.SetFocus


a.Close


Comm2.Caption = "連接"


End Sub


 


Private Sub Comm1_Click()


a.Close '關閉連接


Form1.WindowState = 1


End Sub


 


Private Sub Comm2_Click()


If Comm2.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


End If


End Sub


 


Private Sub Form_DblClick()


If MsgBox("關閉本聊天室! 確認嗎?", 36, "退出系統") = 6 Then


End


Else


Form1.WindowState = 1


End If


End Sub


 


Private Sub Form_Load()


If App.PrevInstance Then


MsgBox "本系統已經載入,請看任務攔!", 48, "提示"


End


End If


flag = False


Load Form2 ‘讀入form2進入監聽


End Sub


 


Private Sub Send_Click()


Dim S As String


On Error GoTo ffff ‘防止鏈路中斷


Send.MousePointer = 11


If Right(Text1.Text, 1) <> Chr(10) Then


S = Text1.Text + Chr(13) + Chr(10)


Else


S = Text1.Text


End If


If flag Then


a.SendData S


End If


Exit Sub


ffff:


MsgBox "連接中斷!", 48, "提示"


a.Close


Send.MousePointer = 0


Comm2.Caption = "連接"


Label3.Caption = "等待連接"


Combo1.Enabled = True


Comm2.MousePointer = 0


Form1.MousePointer = 0


Exit Sub


End Sub


 


Private Sub Timer1_Timer()


flag = False


Timer1.Enabled = False


Comm2.MousePointer = 0


Form1.MousePointer = 0


MsgBox "網路連接失敗(超時) !"


Label3.Caption = "等待連接"


Combo1.Enabled = True


Combo1.SetFocus


a.Close


Comm2.Caption = "連接"


End Sub


 


? 在Form2的各控制項事件中加入如下代碼:


Const maxn = 200 ‘最大同時連接本機的客戶數


Dim user(maxn) As Boolean


 


Private Sub Command1_Click()


Form2.Hide


End Sub


 


Private Sub Command2_Click()


Load Form1


Form1.Show


End Sub


 


Private Sub Form_Load()


Dim str1 As String


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


'winsock控制項 a 作為伺服器程式監聽


a.LocalPort = 3000


a.Listen


End Sub


 


Private Sub a_ConnectionRequest(ByVal requestID As Long)


Dim i As Long


For i = 1 To maxn ‘當一客戶請求時給啟動一Winsock控制項標誌號


If Not user(i) Then


user(i) = True


Exit For


End If


Next i


If i > maxn Then


Exit Sub


End If


Load b(i) ‘當一客戶請求時啟動一Winsock控制項


b(i).Accept requestID '實際建立連接


If Text1.Text = "" Then '發送資料


b(i).SendData Chr(0)


Else


b(i).SendData Text1.Text


End If


Form2.Show


End Sub


 


Private Sub s_Close(Index As Integer)


b(Index).Close '關閉連接


Unload b(Index) '卸載 一個WinSock 控制項


user(Index) = False


End Sub


 


Private Sub b_DataArrival(Index As Integer, ByVal bytesTotal As Long)


Dim str As String


Dim i As Long


b(Index).GetData str


Text1.Text = Text1.Text + str


For i = 1 To maxn


If user(i) Then


b(i).SendData str


End If


Next i


End Sub


三‧運行


本程式在VB6.0中編譯通過,運行後最小化到任務欄上,也可以用API的Shell_Notifyicon 函數做入右下角的指示器欄中常駐記憶體。你可以在網路中用一個固定的機器位址作為聊天討論室,其他用戶都選該機位址連接進入該室聊天或討論。各用戶也可選各自熟悉的位址進行連接對話,雙擊form1空白處從記憶體中撤出系統。根據同樣的原理可以製作電子郵件系統。

arrow
arrow
    全站熱搜

    jacky2172 發表在 痞客邦 留言(4) 人氣()