迪麗拜爾·艾海提
摘 要 本文通過網絡通訊協議、編程模式、聊天數據存儲方式三個方面,對網絡聊天室的設計方法進行探討,以期對學習和實現網絡聊天室的設計人員選擇何種方式實現聊天室功能提供參考依據和幫助。
關鍵詞 網絡通訊協議 套接字 網絡聊天室
網絡聊天室是網絡應用中最普遍的一種應用,網上聊天( 聊天室、QQ、ICQ 等) 就是給網絡用戶提供的一個方便快捷的交流平臺。因此,各大門戶網站和企業網站都提供了專門的聊天室網絡服務,例如,新浪聊天室、網易聊天室、搜狐聊天室, 也有一些專門的聊天室網站和企業, 如碧聊、騰訊QQ等。
本文通過網絡通訊協議、編程模式、聊天數據存儲方式3個方面,從技術角度,對網絡聊天室的設計方法進行探討,以期對學習和實現網絡聊天室的設計人員選擇何種方式實現聊天室功能提供參考依據和幫助。
一、網絡通訊協議
首先,我們分析網絡聊天室常用的網絡通訊協議。目前,聊天軟件使用最多的協議是UDP和TCP。UDP是不可靠傳輸服務,TCP是可靠傳輸服務。UDP就像點對點的數據傳輸一樣,發送者把數據打包,包上有收信者的地址和其他必要信息,至于收信者能不能收到,UDP協議并不保證。而TCP協議就像(實際他們是一個層次的網絡協議)是建立在UDP的基礎上,加入了校驗和重傳等復雜的機制,來保證數據可靠地傳達到收信者。一個是面向連接,一個無面向連接,各有用處。在一些數據傳輸率高的場合如視頻會議傾向于UDP,而對一些數據安全要求高的地方,如淘寶旺旺,要保留聊天信息作為交易的佐證,就傾向于TCP。在實際應用中,用于編寫聊天室的網絡編程語言(例如C#)里,已將TCP、UDP協議封裝為相應的類庫,提供了一系列方法供程序員進行操作。可以簡單地理解為,基于TCP的編程就好像通電話,一方撥通電話,另一方必須按下接聽鍵,兩者之間才能建立起有效的連接。而基于UDP的編程就好像是收音機廣播,一方只管播,對方誰在聽或者是否收到,發送消息方并不關心。常用聊天室(聊天工具)應用的網絡通訊協議列表,見表1:
表1 常用聊天室(聊天工具)應用的網絡通訊協議列表
實現基于UDP協議的C/S聊天室的編程代碼片段:
public partial class Form1 : Form
{
UdpClient uc; //聲明Udp客戶端
public Form1()
{
uc = new UdpClient(); //初始化
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string temp = this.textBox1.Text; //保存TextBox文本
//將該文本轉化為字節數組
byte[] b = System.Text.Encoding.UTF8.GetBytes(temp);
//向本機的8888端口發送數據
uc.Send(b, b.Length,Dns.GetHostName(),8888);
}
}
實現基于TCP協議的C/S聊天室的編程代碼片段:
public partial class Form1 : Form
{
//聲明Tcp客戶端
private TcpClient tc;
//聲明網絡流
private NetworkStream ns;
public Form1()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
//注冊本機8888端口
tc = new TcpClient(“localhost”,8888);
//實例化網絡流對象
ns = tc.GetStream();
string temp = this.textBox1.Text;
StreamWriter sw = new StreamWriter(ns);
StreamReader sr = new StreamReader(ns);
//將TextBox1的值傳給服務器端
sw.WriteLine(temp);
sw.Flush();
//接收服務器端回傳的字符串
string str = sr.ReadLine();
this.textBox2.Text = str;
sr.Close();
sw.Close();
}
}
二、編程模式
1.分析聊天室的編程模式。目前網絡編程的主要模式是:C/S 和 B/S兩種編程模式。C/S是美國Borland公司最早研發,B/S是美國微軟公司研發。
2.C/S(Client/Server即客戶機/服務器)模式。就是需要單獨開發客戶應用程序和服務器程序,充分利用客戶機和服務器兩端硬件環境的優勢,將任務合理分配到Client端和Server端來實現,降低了系統的通訊開銷。優勢是:應用服務器運行數據負荷較輕,數據的儲存管理功能較為透明。劣勢是:維護成本高且投資大,客戶端需要安裝專門的客戶端程序。
3.B/S(Browser/Server,即瀏覽器和服務器)模式。它是隨著Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種模式下,用戶工作界面是通過WWW瀏覽器來實現,極少部分事務邏輯在前端(Browser)實現,而主要事務邏輯在服務器端(Server)實現,這樣就大大簡化了客戶端電腦載荷,減輕了系統維護與升級的成本和工作量,降低了用戶的總體成本。優勢是:維護和升級方式簡單,成本低,客戶端不需要安裝專門的軟件,Web 瀏覽器就可以使用聊天服務。劣勢是:應用服務器運行數據負荷較重。見表2。
表2 C/S模式和B/S模式的區別
常見的C/S模式聊天室,主要是基于套接字(Socket)實現的,而Socket有兩種主要的操作方式:面向連接的(TCP)和無面向連接的(UDP)。基于TCP的socket編程是采用的流式套接字(SOCK_STREAM),而基于UDP采用的數據報套接字(SOCK_DGRAM)。下面以一個基于UDP(面向無連接)的socket編程,說明C/S模式聊天室設計步驟:
第一,服務端程序的設計步驟。(1)創建套接字(soeket)。(2)將套接字綁定到一個本地地址和端口上(bind)。(3)等待接收數據(recvfrom)。(4)關閉套接字。
第二,客戶端的設計步驟。(1)創建套接字(socket)。(2)向服務器發送數據(sendto)。(3)關閉套接字。
B/S模式聊天室,應用程序存儲在服務器端,通過web服務器發布,客戶端通過web瀏覽器訪問。
三、聊天數據存儲方式
聊天室設計實現中,還有一個重點和難點問題,就是怎樣保存聊天內容,以及如何將聊天的信息及時快捷地在服務器和客戶之間進行傳遞和共享。目前聊天室的數據存儲方式主要有以下三種:
(1)利用 Application對象保存聊天內容。
(2)利用文本文件保存聊天內容。
(3)利用數據庫直接保存聊天內容。
第一種方式,就是不需要在外存儲器上存儲聊天數據,而是在服務器的內存中保留聊天信息,因為內存資源有限,需要設置聊天信息內容長度,以隊列方式即時更新數據,即內容超出長度,覆蓋舊信息。優勢是讀寫速度是三種存儲方式中最快,一般用于不需要登錄的聊天室,早期的聊天室用得較多,或開發簡易聊天室用于研究學習聊天室編程技術。
第二種方式,就是把聊天數據以文本文件形式保存在客戶端或服務器端,例如ini文件或log文件,為了提高信息訪問速度,可以按天為單位創建ini文件,保存聊天信息。該存儲方式的劣勢是查找和管理聊天信息比較繁瑣。
第三種方式,把聊天數據保存在數據庫中,可以充分利用數據庫管理系統管理數據的功能,加強了數據的管理。但是需要注意的是,聊天室的訪問量大,以及隨著歷史數據的累計,訪問數據庫的速度會成為瓶頸,因此需要做一些策略考慮。一般把聊天室的聊天數據分兩部分存儲,歷史數據采用數據庫存儲,并自動建表以天為單位,最新200條(或者根多)。聊天數據使用內存存儲,超過一定時間,例如30 min轉儲到相應的當天自動建的表中這樣可以有效地提高數據庫的讀寫速度,避免每次請求讀出所有數據。
四、結束語
網絡聊天室是信息交流平臺之一,除了基本聊天功能,已經朝著實用性的方向發展。例如:在線學習、名師(專家)在線輔導答疑、遠程培訓等,有針對性的實用聊天室,對聊天室的設計目的更加明確,設計人員可以根據用戶需求,參照上述內容分析,有針對地選擇合適的設計方法,這對設計實現網絡聊天室非常重要。
參考文獻
[1]梁偉.Visual C++網絡編程經典案例詳解.北京:清華大學出版社,第1版,2010.
[2]孫衛琴.Java網絡編程精解.北京:電子工業出版社,2007.