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