客戶端到伺服器端的通訊過程及原理

2021-07-10 21:08:54 字數 3337 閱讀 6198

學習任何東西,我們只要搞清楚其原理,就會觸類旁通。現在結和我所學,我想總結一下客戶端到伺服器端的通訊過程。只有明白了原理,我們才會明白當我們程式開發過程中錯誤的問題會出現在那,才會更好的解決問題。

我們首先要了解乙個概念性的詞彙: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 指令名和指令名...