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

利用VB設計聊天室

編輯:VB綜合教程
Internet上的聊天室一向是一個吸引人的地方,但多用C語言設計,我用VB設計了一個聊天室,取名為“升達自由論壇”,實際使用證明效果良好。

----Internet上的通訊協議是TCP/IP,Internet上數據傳輸協議主要有TCP和UDP,TCP是有連接協議,它要求計算機進行對話時必須先建立連接,保證數據傳送安全到達目的地。UDP是無連接協議,它只是將信息送到網絡上,並不檢查數據是否到達了目的地。要進行實時會話,則應該采用TCP協議。本程序采用的協議就是TCP協議。

----程序分服務和客戶程序兩部分。客戶程序啟動後首先與服務器連接,連接成功後,隨意輸入一個名字即可進入聊天室;服務程序則負責維護與每一個客戶的連接和數據交換,並且記錄下所有聊天內容,及人員名單。由於在會話過程中大家起的都是假名字,不可避免地要有的人講一些不健康內容,為了保持秩序,服務器程序實現了IP地址跟蹤功能。管理人員可以很容易地查找出每一個匿名的計算機名,並對之進行警告或其它處理(下面會進一步介紹)。可保證會話內容的健康。如果服務器程序關閉,則所有客戶程序自動關閉。

VB5的Winsock控件

----VB5企業版提供了Winsock控件,要實現兩台計算機的對話,可以通過Winsock控件進行。而不需了解更多的數據傳輸細節,本程序就是通過Winsock進行的。

----Winsock有多種屬性、方法和事件,本文只列舉出要使用的屬性、方法和事件。

----......

----一個Winsock控件可以建立與一個計算機的聯接,服務器程序中首先設置一個Winsock控件,將其索引值設為0,以便在運行時動態增減元素,這樣可以與多個計算機進行對話。

程序介紹

----服務程序部分

----服務器程序啟動時,先設置自己的本地端口,因為有些端口有其固定的作用,如80是WWW端口,故盡可能選擇不可能使用的端口,這裡我選擇了1600。將連接狀態設置為假,然後開始進行偵聽。當偵聽到有計算機要求與服務器進行對話,就接受,並記錄下客戶機的地址、端口、客戶起的匿名,將連接狀態設置為真,將上述內容存入一個用戶自定義的數組中,進行動態維護。用戶自定義數據類型如下:

PrivateTypeActiveUser
  ClientIPAsString記錄客戶的IP地址
  ClientNameAsString記錄客戶的匿名
  ClientPortAsInteger記錄當前會話的端口
  ClientConnectedAsBoolean
  客戶連接狀態,True表示已連接,False表示沒有連接
  EndType
  

----做完這些工作後,服務器再調入一個新控件,進行新的偵聽,如此反復不斷。如果有客戶退出,則關閉相應的連接。注意不能在客戶端關閉連接,否則會產生錯誤,只能由服務器關閉連接。服務器程序主要對象設置

.
  .
  .
  

----利用上述對象可以實現服務器的各種功能,當然,還可以再加入新控件,以使界面更美觀。

----服務程序中三個關鍵程序段如下:

----1.處理連接請求

----sckServer_ConnectionRequest過程處理連接請求,當遠程計算機要求連接時,服務器首先檢查用戶自定義數組中是否有空閒位置(因為在談話中途,肯定會有人退出,所以會產生空閒位置),如果有則選擇空閒位置給予要求連接的客戶,否則將數組維數加一,將之給予請求連接的遠程節點。錯誤處理主要是忽略兩個或兩個以上的客戶同時要求連接時產生的地址沖突現象。

----......

----2.處理處於連接狀態的用戶發送來的信息

----sckServer_DataArrival過程處理客戶端傳來的數據。當有數據發送過來後,服務器首先接收數據,調用自定義過程HandleOtherMessage檢查是談話內容還是其它信息,如果是其它信息,則在HandleOtherMessage中進行處理,否則在本過程中進行處理。

----因為Winsock控件將數據首先送至緩沖區,待緩沖區滿才發送信息,這顯然不能保證適時對話,用Doevents語句可確保Windows將數據及時送出。其中的錯誤處理程序處理當遠程計算機非正常關閉程序時產生的錯誤,因為此時服務器並不知道它已關閉,仍然向它發送信息,這樣就會產生錯誤,導致服務程序關閉,中斷整個談話。處理方法只是簡單地關閉掉該連接即可。

----......

----3.關閉客戶連接

----sckServer_Close過程關閉與客戶的連接,刪除控件,收回系統資源,將該位置的連接狀態設置為假,以便有用戶請求連接時繼續使用。它一般由HandleOtherMessage過程調用

----......

----如何保證聊天內容的健康是一個很重要的方面,在Internet上,我們對談話內容不健康者,只有將之開除出聊天室。但在局域網上則可以查出是誰談話不文明(局域網環境為WindowsNT4.0服務器,Windows95工作站)。方法如下:在95工作站上將網絡中的TCP/IP協議中的IP地址選項設為動態獲得IP地址,在NT服務器上用DHCP管理工具為每一個客戶機進行IP地址動態分配。聊天服務程序記錄下來了每一個客戶的IP地址,我們就可以通過DHCP管理工具很容易地查出某IP地址對應的計算機名,並進行處理。

客戶程序部分

----客戶程序啟動時首先設置服務器的地址及端口,這裡我直接使用了“192.168.0.2”,這是我的服務器地址,可以在Form_load過程中設置你自己的服務器地址,也可在程序開始時讓用戶輸入服務器地址以增加靈活性。時鐘控件用以與遠程節點進行自動連接。

----......

----客戶程序主要對象設置

----......

----“”顯示所有正在聊天室中的用戶名

----顯示當前的狀態(用戶名,IP地址及是否密談)

----與服務器程序一樣,這裡列出的並非全部的控件,但是已經足以完成工作。

----客戶程序中的自定義類MyMessage用來記錄自己的信息,

----......

----類中的變量cmdExitClick用來記錄用戶是否按了退出按鈕,如果是按了退出按鈕則為真。當用戶選擇了系統的窗體關閉菜單而沒有按退出按鈕時將會產生錯誤,因此用它來記錄是如何退出的,如果選擇了系統的窗體關閉菜單,則執行一次cmdExit_Click()過程,以確保無誤。

----客戶退出時,不是簡單地關閉自己的Winsock控件,而是發送一個字符串(我采用了一個大家在聊天時很難用到的字符串“=_RE”)給服務器,表明自己要退出,由服務器端關閉連接,進而關閉自身。

->

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