學習任何東西,我們只要搞清楚其原理,就會觸類旁通。現在結和我所學,我想總結一下客戶端到伺服器端的通訊過程。只有明白了原理,我們才會明白當我們程式開發過程中錯誤的問題會出現在那,才會更好的解決問題。
我們首先要了解乙個概念性的詞彙:socket
socket的英文原義是「孔」或「插座」。作為程序通訊機制,取後一種意思。通常也稱作「套接字」,用於描述ip位址和埠,是乙個通訊鏈的控制代碼。(其實就是兩個程式通訊用的。)socket非常類似於**的插座。以乙個**網為例。**的通話雙方相當於相互通訊的2個程式,**號碼可以當作是ip位址。任何使用者在通話之前,首先要占有一部**機,相當於申請乙個socket;同時要知道對方的號碼(ip位址),相當於對方有乙個固定的socket。然後向對方撥號呼叫,相當於發出連線請求。對方假如在場並空閒,拿起**話筒,雙方就可以正式通話,相當於連線成功。雙方通話的過程,是一方向**機發出訊號和對方從**機接收訊號的過程,相當於向socket傳送資料和從socket接收資料。通話結束後,一方掛起**機相當於關閉socket,撤消連線,通訊完成。
以上通訊是以兩個人通話做為事例來在概的說明了下通訊,但是現在假如通訊中的乙個人是外國人(說英語),乙個人是中國人(說普通話),他們倆相互通訊的話,都不能聽明白對方說的是什麼,那麼他們的溝通就不能夠完成。但是如果我們給乙個規定,給通話雙方,只能講普通話,那麼雙方溝通就沒有障礙了。這就引出來了通訊協議。
有兩種型別:(tcp協議與udp協議):
tcp協議與udp協議是在兩硬體裝置上進行通訊傳輸的一種資料語法。
– 流式socket(stream):
是一種面向連線的socket,針對於面向連線的tcp服務應用,安全,但是效率低;tcp:是以流的形式來傳的。
– 資料報式socket(datagram):
是一種無連線的socket,對應於無連線的udp服務應用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高.udp:將資料報拆開為若干份編號後來傳輸。在傳輸的過程中容易出現資料的丟失。但是傳輸速度要比tcp的快。
socket的通訊流程
– 申請乙個socket (socketwatch)用來監聽的
– 繫結到乙個ip位址和乙個埠上
– 開啟偵聽,等待接授客戶端的連線
– 當有連線時建立乙個用於和連線進來的客戶端進行通訊的socket(socketconnection)
– 即續監聽,等侍下乙個客戶的連線
**如下:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using system.net;//ipadress,ipendpoint(ip和埠)類
using system.net.sockets;
using system.threading;
using system.io;
namespace mychatroomserver
thread threadwatch = null;//負責監聽 客戶端 連線請求的 執行緒
socket socketwatch = null;//負責監聽的 套接字
private void btnbeginlisten_click(object sender, eventargs e)
//儲存了伺服器端 所有負責和客戶端通訊的套接字
dictionarydict = new dictionary();
//儲存了伺服器端 所有負責呼叫 通訊套接字.receive方法 的執行緒
dictionarydictthread = new dictionary();
//socket sokconnection = null;
/// /// 監聽客戶端請求的方法
///
void watchconnecting()
}/// /// 服務端 負責監聽 客戶端 傳送來的資料的 方法
///
void recmsg(object socketclientpara)
catch (socketexception ex)
catch (exception ex)
if (arrmsgrec[0] == 0)//判斷 傳送過來的資料 的第乙個元素是 0,則代表傳送來的是 文字資料}}
}}
//傳送訊息到客戶端
private void btnsend_click(object sender, eventargs e)
else
catch (socketexception ex)
catch (exception ex)}}
//服務端**訊息
private void btnsendtoall_click(object sender, eventargs e)
showmsg("**完畢!:)");
}#region 顯示訊息
/// /// 顯示訊息
///
///
void showmsg(string msg)
thread threadclient = null; //客戶端 負責 接收 服務端發來的資料訊息的執行緒
socket socketclient = null;//客戶端套接字
//客戶端傳送連線請求到伺服器
private void btnconnect_click(object sender, eventargs e)
/// /// 監聽服務端 發來的訊息
///
void recmsg()
}void showmsg(string msg)}}
通訊過程圖
通過以上流程圖我們可以看出,客戶端與伺服器端之間的乙個基本通訊流程,概括一下socket 一般應用模式(客戶端和伺服器端)的作用:
伺服器端:最少有兩個socket,乙個是服務端負責監聽客戶端發來連線請求,但不負責與請求的客戶端通訊,另乙個是每當伺服器端成功接收到客戶端時,但在伺服器端建立乙個用與請求的客戶端進行通訊的socket.
客戶端:指定要連線的伺服器端位址和埠,通過建立乙個socket物件來初始化乙個到伺服器端的tcp連線。
其實很早就想寫下這篇總結了,但是由於工作較忙,一直推遲到現在。這篇總結也是為我接下來要寫的瀏覽器與iis伺服器的通訊過程和asp.net頁面生命週期做乙個鋪墊,現在終於寫完了,來和大家一起分享一下,不完善的地方,我將在以後的工作和學習過程中慢慢補充。
客戶端到伺服器端的通訊過程及原理
學習任何東西,我們只要搞清楚其原理,就會觸類旁通。現在結和我所學,我想總結一下客戶端到伺服器端的通訊過程。只有明白了原理,我們才會明白當我們程式開發過程中錯誤的問題會出現在那,才會更好的解決問題。我們首先要了解乙個概念性的詞彙 socket socket的英文原義是 孔 或 插座 作為程序通訊機制,...
客戶端到伺服器端的通訊過程及原理
我們首先要了解乙個概念性的詞彙 socket socket的英文原義是 孔 或 插座 作為程序通訊機制,取後一種意思。通常也稱作 套接字 用於描述ip位址和埠,是乙個通訊鏈的控制代碼。其實就是兩個程式通訊用的。socket非常類似於 的插座。以乙個 網為例。的通話雙方相當於相互通訊的2個程式,號碼可...
客戶端與伺服器端通訊
關係圖 傳送 邏輯管理器 處理邏輯傳送指令 指令解析管理器 根據協議xml解析指令成二進位制資料 把二進位制資料傳給伺服器 接收 伺服器傳送二進位制資料到客戶端 指令解析管理器 根據協議xml解析二進位制資料 根據解析資料對映到邏輯類來處理 2 1 3 20 2,2 21 1,1,2 指令名和指令名...