基於Socket通訊(C#)和WebSocket協議(net)編寫的兩種聊天功能(文末附源碼下載地址)
轉載:https://www.cnblogs.com/xiongze520/p/10338802.html
今天我們來盤一盤Socket通訊和WebSocket協議在即時通訊的小應用——聊天。
理論大家估計都知道得差不多了,小編也通過查閱各種資料對理論知識進行了充電,發現好多demo似懂非懂,拷貝回來又運行不了,
後來一咬牙,決定自己寫一個demo出來,所以我們這裏就不做理論延伸,只做demo演示,有不懂的可以在評論區討論討論。
demo演示有兩個,一個C#的Windows窗體應用程序,一個是net mvc。(小編demo編譯器是visual studio2013)
- Socket通訊
- Socket原理
- 實現的功能——聊天室
- 效果圖
- 源碼下載
- WebSocket協議
- WebSocket原理
- 實現的功能——聊天室
- 效果圖
- 源碼下載
Socket通訊:
Socket原理:
socket由IP地址和端口號組成,可以通過TCP,UDP,IP協議實現不同虛擬機或不同計算機之間的通信,效率較高。
現階段socket通信使用TCP、UDP協議,相對應UDP來說,TCP則是比較安全穩定的協議了。本文只涉及到TCP協議來說socket通信。
首先講述TCP/IP的三次握手,在握手基礎上延伸socket通信的基本過程。
下面介紹最臭名昭著的三次握手四次揮手:
1 客戶端發送syn報文到服務器端,並置發送序號為x。
2 服務器端接收到客戶端發送的請求報文,然後向客戶端發送syn報文,並且發送確認序號x+1,並置發送序號為y。
3 客戶端受到服務器發送確認報文後,發送確認信號y+1,並置發送序號為z。至此客戶端和服務器端建立連接。
在此基礎上,socket連接過程為:
服務器監聽:服務器端socket並不定位具體的客戶端socket,而是處於等待監聽狀態,實時監控網絡狀態。
客戶端請求:客戶端clientSocket發送連接請求,目標是服務器的serverSocket。為此,clientSocket必須知道serverSocket的地址和端口號,進行掃描發出連接請求。
連接確認:當服務器socket監聽到或者是受到客戶端socket的連接請求時,服務器就響應客戶端的請求,建議一個新的socket,把服務器socket發送給客戶端,一旦客戶端確認連接,則連接建立。
註:在連接確認階段:服務器socket即使在和一個客戶端socket建立連接後,還在處於監聽狀態,仍然可以接收到其他客戶端的連接請求,這也是一對多產生的原因。
socket連接原理知道了,我們編寫最基本最簡單的socket通信
實現的功能——聊天室
- 服務端
- 客戶端
服務端:
客戶端:
由於代碼有窗體和類,放在這裏比較多,我就不粘貼出來了,下載源碼可以直接查看源碼。
百度網盤:https://pan.baidu.com/s/1bnY7ldN9gyUmB6q3cXaTEg
提取碼:f7he
效果圖:
源碼下載:
百度網盤:https://pan.baidu.com/s/1bnY7ldN9gyUmB6q3cXaTEg
提取碼:f7he
WebSocket協議:
webSocket原理:
WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。
WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。
在 WebSocket API 中,瀏覽器和服務器只需要做一個握手的動作,然後,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
現在,很多網站為了實現推送技術,所用的技術都是 Ajax 輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP請求,然後由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
HTML5 定義的 WebSocket 協議,能更好的節省服務器資源和帶寬,並且能夠更實時地進行通訊。
瀏覽器通過 JavaScript 向服務器發出建立 WebSocket 連接的請求,連接建立以後,客戶端和服務器端就可以通過 TCP 連接直接交換數據。
當你獲取 Web Socket 連接後,你可以通過 send() 方法來向服務器發送數據,並通過 onmessage 事件來接收服務器返回的數據。
屬性 | 描述 |
---|---|
Socket.readyState |
只讀屬性 readyState 表示連接狀態,可以是以下值:
|
Socket.bufferedAmount |
只讀屬性 bufferedAmount 已被 send() 放入正在隊列中等待傳輸,但是還沒有發出的 UTF-8 文本字節數。 |
事件 | 事件處理程序 | 描述 |
---|---|---|
open | Socket.onopen | 連接建立時觸發 |
message | Socket.onmessage | 客戶端接收服務端數據時觸發 |
error | Socket.onerror | 通信發生錯誤時觸發 |
close | Socket.onclose | 連接關閉時觸發 |
方法 | 描述 |
---|---|
Socket.send() |
使用連接發送數據 |
Socket.close() |
關閉連接 |
實現的功能——聊天室:
WebSocket 協議本質上是一個基於 TCP 的協議。
為了建立一個 WebSocket 連接,客戶端瀏覽器首先要向服務器發起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息,
其中附加頭信息"Upgrade: WebSocket"表明這是一個申請協議升級的 HTTP 請求,服務器端解析這些附加的頭信息然後產生應答信息返回給客戶端,
客戶端和服務器端的 WebSocket 連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,並且這個連接會持續存在直到客戶端或者服務器端的某一方主動的關閉連接。
代碼主要分為3部分組成:前端html頁面、服務器端ashx一般處理程序、封裝的消息發送幫助類。
代碼比較多,不方便粘貼出來,直接鏈接下載:
百度網盤:https://pan.baidu.com/s/1AEHfRZzBFWEpcOehNBOjRg
提取碼:pu2f
註意,這個demo在Windows7上面是無法運行的,因為Windows7上面沒有webSocket協議,也許有其他方法,但是我沒找到,我是在Windows10上面運行的,Windows8也可以。
需要安裝webSocket協議,類似於iis安裝,具體看下圖:
然而Windows7是沒有這個的,看圖:
效果圖:
源碼下載:
百度網盤:https://pan.baidu.com/s/1AEHfRZzBFWEpcOehNBOjRg
提取碼:pu2f
C# Socket 的demo:
百度網盤:https://pan.baidu.com/s/1bnY7ldN9gyUmB6q3cXaTEg
提取碼:f7he
net WebSocket的demo
百度網盤:https://pan.baidu.com/s/1AEHfRZzBFWEpcOehNBOjRg
提取碼:pu2f
總結:這兩種方式都有各自的局限性,實際項目中我們可以根據自身情況進行優化,webscoket對於系統的選擇比較高。
demo有了,快去下載來試試吧,最快的成功就是復制,至於裏面的邏輯我們可以慢慢來
基於Socket通訊(C#)和WebSocket協議(net)編寫的兩種聊天功能(文末附源碼下載地址)