聊天室

聊天室

聊天室是一個網上空間,為了保證談話的焦點,聊天室有一定的談話主題。任何一個聯入Internet、使用正確的聊天軟體,並且渴望談論的人都可以享受其樂趣。聊天室可以建立在即時通訊軟體(如MSN Messenger、QQ、Anychat)、P2P軟體、全球資訊網(如 Halapo,Meebo ) 等基礎上,全球資訊網方式更為普通和種類繁多,交談的手段不局限於文本,更包括語音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網人可以實時地廣播和閱讀公開訊息。一般情況下,與其它網路論壇、即時通訊不同的是,聊天室不保存聊天記錄。

基本信息

基本介紹

網路聊天室通常直稱聊天室,是一種人們可以線上交談的網路論壇,在同一聊天室的人們通過廣播訊息進行實時交談。
聊天室可以建立在即時通訊軟體(如MSNMessenger、QQ、Anychat)、P2P軟體、全球資訊網(如Halapo,Meebo)等基礎上,全球資訊網方式更為普通和種類繁多,交談的手段不局限於文本,更包括語音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網人可以實時地廣播和閱讀公開訊息。一般情況下,與其它網路論壇、即時通訊不同的是,聊天室不保存聊天記錄。
聊天室基本原理是,拋開CGI和WWW伺服器,根據HTML規範,接收到瀏覽器的請求以後,模仿WWW伺服器的回響,將聊天內容發回瀏覽器。在瀏覽器看來就像瀏覽一個巨大的頁面一樣始終處於頁面聯接狀態,這就是一個專門的聊天伺服器,一個簡化了的WWW伺服器。

chat room(聊天室)是一個網上空間,為了保證談話的焦點,聊天室有一定的談話主題,比如:足球。任何一個聯入Internet、使用正確的聊天軟體,並且渴望談論的人都可以享受其樂趣。

聊天室聊天室

分類

視頻類

視頻聊天室是在一個網站中或者客戶端軟體中,供許多人通過文字與視頻進行實時(您輸入的內容馬上就能被別人看見)交談、聊天的場所,它是一個向整個網際網路開放的地方。例如:anychat、9158等。

文字類

文字聊天室是網站中以文字或符號顯示為信息傳遞方式的聊天方式。聊天室有一對一聊天、多人群聊等形式。文字聊天室多見於手機功能,或使用手機套用進行文字聊天,或使用瀏覽器作為載體進行網頁文字聊天。例如:omegle、妙戀佳人網手機wap聊天室等

這樣相比CGI方式來說,聊天室的優點就很明顯:
不需要專門的WWW伺服器,在聊天伺服器里完成必要的工作,避開耗時的CGI過程。
如果使用單進程伺服器,就不需要每次產生新進程。
數據交換完全在記憶體中進行,不用讀寫檔案。
不需要定時刷新,減少螢幕的閃爍,減少對伺服器的請求次數。

實現流程

一、聊天伺服器實現流程
用戶數據輸入都是通過URL傳送,下面是幾個URL實例,結合後面客戶端流程,可以更好地理解系統結構。
這是一個用戶名密碼均為‘aaa''''的聊天用戶登錄系統,說了一句話“hello”,然後退出所產生的一系列請求,其中密碼用系統函式crypt加密過:
二、客戶端具體登錄過程
我們先看看聊天界面:
聊天界面由三個frame組成,其中chat幀是聊天內容顯示部分,talk幀是用戶輸入部分,包括聊天內容輸入、動作、過濾以及管理功能都在這一幀輸入,names是線上名單顯示部分,這一部分是定時刷新的。

過程

讓我們從瀏覽器的角度來看看進入聊天室的過程。
1.首先瀏覽器請求頁面:
此時產生了一個連線到伺服器聊天連線埠的聯接,並傳送了一行數據:
2.伺服器生成一個sessionID,驗證密碼以後,發回:
然後伺服器關閉聯接。
3.瀏覽器收到以上檔案後,將會依次打開三個聯接(其中的$sid和$encrypt_pass是變數):
這三個聯接中的第一個聯接chat在整個聊天過程中都是保持聯接的,這樣從瀏覽器角度來看,就是一個始終下載不完的大頁面,顯示效果上就是聊天內容不是靠刷新來更新,而是不斷地向上滾動。通過察看代碼可以看到,然後就是不斷增加的聊天內容.
另外兩個聯接在頁面傳送完畢以後,就關閉了。
這樣一次登錄聊天室實際上有四次聯接,但登錄完成以後,只有chat幀的是保持聯接的,用於接收來自伺服器的聊天信息,這是聊天室的關鍵所在。
在伺服器端儲存了所有參加聊天的客戶的chat,當有人發言時,伺服器就向所有chat傳送聊天內容。
Talk與names幀的html實際上和普通的form是一樣的。
4.在用戶登錄以後,伺服器端保存了一張包括用戶信息的表格:
在perl實現中,我們使用哈希結構儲存信息,以sessionID作為key索引。這樣的存儲結構便於存取數據,回收空間。每個客戶信息是一個數組:
[name,passwd,privilige,filter,login_time,color]:儲存chat幀聯接name:用戶名passwd:密碼privilige:許可權filter:某個用戶的過濾列表的引用(reference)login_time:記錄登錄時間,以便以後清除一些逾時聯接color:用戶聊天顏色
以上用戶數據大部分是在login階段,用戶通過密碼驗證以後填入的。只有chat要等到achat幀顯示以後才得到。如果超過一定時間,還是沒有填入,說明瀏覽器取得主框架以後連線中斷了,這時候就需要刪除該用戶數據。
以上是聊天室核心部分,其他部分,如用戶註冊、改密碼等可以沿用CGI聊天室代碼。
聊天室聊天室

功能改進

目前提供了聊天、悄悄話、動作這些基本聊天功能以及過濾用戶名單這樣的附加功能。管理功能完成了踢人、查IP、任命室主。今後需要改進的地方有:
穩定性:目前聊天室還沒有經過大用戶量測試,穩定性還不能充分保證。由於是單進程循環伺服器,某個用戶通信死鎖將導致所有人死鎖。如果採用並發多進程伺服器,可以使穩定性得到提高。但這樣的系統對伺服器資源消耗也會大許多。
功能:自建聊天室等功能已完成,這些外圍功能在穩定性有保證以後就可以比較容易地加入。
編輯本段
分類
按功能分類可以看出,聊天室可分為語音聊天室和視頻聊天室
語音聊天室:即聊天過程中以語音為基礎進行交流,為了避免聊天室太混亂,就引入了排麥的概念,即要講話的都點擊自己的麥,加入下次發言的佇列中,按先申請先發言的規則來玩.
視頻聊天室:一般集合了語音聊天與文本聊天,視頻聊天過程中對網路頻寬要求更高,電腦需配置有攝像頭才能傳送視頻信號.真正做到面對面的聊天

相關資料

首先要說,編寫真正好的收費聊天室已經超出了CGI的範疇,要求不僅對語言而且對作業系統和網路協定有一定的了解,需要一些經驗的積累。簡單的說就是編寫連線埠守護程式,這裡牽扯到socket編程,進程間互動,(二者都是比較古老的技術),以及HTTP協定。前面“天水”同志已經貼出了這部分的C代碼,我只是稍做解釋。聊博高手一哂。1.socket編程,利用UNIX的socket抽象概念打開伺服器的一個面向連結的連線埠,等待外部的聯接請求。 perl語言使用名空間IO::Socket::INET,在新版本的perl中我推薦使用HTTP::Daemon配合HTTP::Request(可以簡化HTTP處理過程)。2.進程間互動,這是實現不刷屏的關鍵所在,socket連結後通常利用子進程完成與用戶的具體互動工作(當client存在,子進程一直與其保持連結,不首先關閉連結),而父進程返回等待其他連結請求。父進程與子進程間的互動工作通常用管道pipe()來完成,這裡使用單工管道即可,即父-〉子。工作是這樣的:當有內容提交,父進程將它通過管道傳遞給所有存在的子進程(通常保存在hash中),然後子進程分別發給各自的client.看起來不難。 值得注意的問題:一是判斷用戶client是否關閉連結。二是子進程退出後,捕捉$SIG信號。這兩點很重要,開放過多的進程,管道和將大量的信號全都仍給作業系統,它還受得了么?保存管道的hash也不能越來越大吧?3.HTTP協定,就是分析用戶的HTTP請求,並且返回HTTP應答。 首先看看請求是什麼方式,get還是post,當然還有一些不常用的。get處理起來比較簡單,post要通過head的信息read()body,網上對HTTP具體結構的闡述很多,我就不多說了。值得注意的問題:一個是換行符問題,新手就把它都當作\012\015即可。另一個是HTTP1.1同老闆本在處理post時不太一樣。掌握了以上內容,可以嘗試編寫一個簡單的HTTPserver,會很有滿足感的^_^perl繼承了大量的c的*.h,編寫上述問題完全可以勝任,細節都和c很相似,請關注perl朋友,對它有充分的信心!上面說的前兩點都是跟作業系統相關的,NT還不行,我在ActivePerl5.6上試過,並不像傳說的,有很多問題。不修改代碼直接在NT上使用我們只能期待更完善的activeperl了。錯誤之處請高手糾正,共同進步。
目前官方收錄中文免費視頻聊天站點119個,包括新浪UC,呱呱視頻社區,9158,唐人街,跳舞吧,好聊,愛聊,康福,齊秀,碧聊,等國內最知名的視頻聊天室站點。國外站點19個。尤其以呱呱視頻社區為代表的聊天室讓廣大聊天愛好者真實感受聊天帶來的快樂!

優點

1.這樣相比CGI方式來說,聊天室的優點就很明顯。
2.不需要專門的WWW伺服器,在聊天伺服器里完成必要的工作,避開耗時的CGI過程。

聊天室聊天室

3.如果使用單進程伺服器,就不需要每次產生新進程。
4.數據交換完全在記憶體中進行,不用讀寫檔案。
5.不需要定時刷新,減少螢幕的閃爍,減少對伺服器的請求次數。

進入

通常聊天室有兩種,一種是基於網頁的,還有一種是需要安裝軟體的。
我們來看看第一種瀏覽器的看看進入聊天室的過程。
1.首先瀏覽器請求頁面:
此時產生了一個連線到伺服器聊天連線埠的聯接,並傳送了一行數據:
2.伺服器生成一個sessionID,驗證密碼以後,發回:
然後伺服器關閉連線。
3.瀏覽器收到以上檔案後,將會依次打開三個連線(其中的$sid和$encrypt_pass是變數):
這三個聯接中的第一個聯接chat在整個聊天過程中都是保持連線的,這樣從瀏覽器角度來看,就是一個始終下載不完的大頁面,顯示效果上就是聊天內容不是靠刷新來更新,而是不斷地向上滾動。通過察看代碼可以看到,然後就是不斷增加的聊天內容.
另外兩個連線在頁面傳送完畢以後,就關閉了。
這樣一次登錄聊天室實際上有四次連線,但登錄完成以後,只有chat幀的是保持連線的,用於接收來自伺服器的聊天信息,這是聊天室的關鍵所在。
在伺服器端儲存了所有參加聊天的客戶的chat,當有人發言時,伺服器就向所有chat傳送聊天內容。
Talk與names幀的html實際上和普通的form是一樣的。
4.在用戶登錄以後,伺服器端保存了一張包括用戶信息的表格:
在perl實現中,我們使用哈希結構儲存信息,以sessionID作為key索引。這樣的存儲結構便於存取數據,回收空間。每個客戶信息是一個數組:
[name,passwd,privilige,filter,login_time,color]:儲存chat幀聯接name:用戶名passwd:密碼privilige:許可權filter:某個用戶的過濾列表的引用(reference)login_time:記錄登錄時間,以便以後清除一些逾時聯接color:用戶聊天顏色
以上用戶數據大部分是在login階段,用戶通過密碼驗證以後填入的。只有chat要等到chat幀顯示以後才得到。如果超過一定時間,還是沒有填入,說明瀏覽器取得主框架以後連線中斷了,這時候就需要刪除該用戶數據。
以上是聊天室核心部分,其他部分,如用戶註冊、改密碼等可以沿用CGI聊天室代碼。
致於第二種就簡單多了,下載聊天室程式安裝後註冊一個帳號,就可以登入了。

相關詞條

相關搜尋

熱門詞條

聯絡我們