首先我們要了解一下幾點內容:
簡單來說:tcp控制傳輸資料,負責發現傳輸的問題,一旦有問題就發出訊號,要求重新傳輸,直到所有資料安全正確地傳輸到目的地,而ip是負責給網際網路中的每一台電腦定義乙個位址,以便傳輸。從協議分層模型方面來講:tcp/ip由:網路介面層(鏈路層)、網路層、傳輸層、應用層。它和osi的七層結構以及對於協議族不同,下圖簡單表示:
現階段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建立連線後,還在處於監聽狀態,仍然可以接收到其他客戶端的連線請求,這也是一對多產生的原因。
下圖簡單說明連線過程:
伺服器端介面和**:
thread threadwatch = null; // 負責監聽客戶端連線請求的 執行緒;
socket socketwatch = null;
dictionarydict = new dictionary();
dictionarydictthread = new dictionary();
private void btnbeginlisten_click(object sender, eventargs e)
catch (socketexception se)
// 設定監聽佇列的長度;
socketwatch.listen(10);
// 建立負責監聽的執行緒;
threadwatch = new thread(watchconnecting);
threadwatch.isbackground = true;
threadwatch.start();
showmsg("伺服器啟動監聽成功!");
btnbeginlisten.enabled = false;
}/// /// 監聽客戶端請求的方法;
///
void watchconnecting()
}void recmsg(object sokconnectionparn)
catch (socketexception se)
catch (exception e)
if (arrmsgrec[0] == 0) // 表示接收到的是資料;
if (arrmsgrec[0] == 1) // 表示接收到的是檔案;}}
}
}void showmsg(string str)
// 傳送訊息
private void btnsend_click(object sender, eventargs e)
else
}/// /// **訊息
///
///
/// 訊息
private void btnsendtoall_click(object sender, eventargs e)
showmsg(strmsg);
txtmsgsend.clear();
showmsg(" **完畢!");
}// 選擇要傳送的檔案
private void btnselectfile_click_1(object sender, eventargs e)
}// 檔案的傳送
private void btnsendfile_click_1(object sender, eventargs e)
else
else}}
txtselectfile.clear();
}private void btnnewclientform_click(object sender, eventargs e)
客戶端介面和**:
thread threadclient = null; // 建立用於接收服務端訊息的 執行緒;
socket sockclient = null;
private void btnconnect_click(object sender, eventargs e)
catch (socketexception se)
showmsg("與伺服器連線成功!!!");
threadclient = new thread(recmsg);
threadclient.isbackground = true;
threadclient.start();
btnconnect.enabled = false;
}void recmsg()
catch (socketexception se)
catch (exception e)
if (arrmsgrec[0] == 0) // 表示接收到的是訊息資料;
if (arrmsgrec[0] == 1) // 表示接收到的是檔案資料;}}
catch (exception aaa)}}
}void showmsg(string str)
// 傳送訊息;
private void btnsendmsg_click(object sender, eventargs e)
// 選擇要傳送的檔案;
private void btnselectfile_click(object sender, eventargs e)
}//向伺服器端傳送檔案
private void btnsendfile_click(object sender, eventargs e)
else
}
}private void frmclient_formclosing(object sender, formclosingeventargs e)
實現通訊結果:
C 利用行為模式實現socket非同步通訊(一)
背景 專案中存在多個socket,按找型別分為兩類 一是條碼掃瞄裝置,第二種是輸送裝置。條碼掃瞄裝置負責條碼採集,是允許接收資料,不存在傳送資料的情況。輸送裝置既可以接收資料,也可以傳送資料。並且,輸送裝置存在多種動作或者流程 入 出 盤點,每種動作對應的邏輯處理都不相同。同時考慮存在以後裝置數量和...
C 基於Socket的CS模式的完整例子
基於socket伺服器端實現本例主要是建立多客戶端與伺服器之間的資料傳輸,首先設計伺服器。開啟vs2008,在d c ch17目錄下建立名為socketserver的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17 6所示。表17 6 新增控制項列表 控 件 name text l...
C 基於Socket的CS模式的完整例子
基於socket伺服器端實現本例主要是建立多客戶端與伺服器之間的資料傳輸,首先設計伺服器。開啟vs2008,在d c ch17目錄下建立名為socketserver的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17 6所示。表17 6 新增控制項列表 控 件 name text l...