C#网络编程(1)
1、Purpose?????????????????????????????????????? ???????????????????? ??????????????????????????????????????????????
1、什么是網絡編程
2、TCP/IP協議
3、什么是套接字
4、多線程深入理解
二、Basic Concept????????????????????????????????????????????????????? ???????????????????????????????????????????????
1、網絡編程:主要實現進程(線程)相互之間的通信和基本的網絡應用原理性(協議)功能的程序。
2、TCP/IP是一個協議族,其中包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等許多協議.
TCP(Transmission Control Protocol)傳輸控制協議IP(Internet Protocol)網際協議
UDP(User Datagram Protocol)用戶數據報協議
ICMP(Internet Control Message Protocol)互聯網控制信息協議
SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協議
SNMP(Simple Network manage Protocol)簡單網絡管理協議
FTP(File Transfer Protocol)文件傳輸協議
ARP(Address Resolation Protocol)地址解析協議
? TCP/IP從某種角度上來說由四個層次構成:網絡接口層、網絡層、傳輸層、應用層.
?
各層所遵守的協議
?具體看看TCP協議
TCP是Transmission Control Protocol(傳輸控制協議)的簡稱,是TCP/IP體系中面向連接的運輸層協議,在網絡中提供全雙工的和可靠的服務。
TCP協議最主要的特點是:
?? 1) 是一種基于連接的協議。
?? 2) 全雙工、點對點。
?? 3) 保證各數據到達的順序與數據發出的順序相同。
?? 4) 傳輸的數據無消息邊界。
解釋:(1)是一種基于連接的協議:意思是說連個遠程主機(或曰進程)必須進行一次握手過程,確認連接成功之后才能傳輸實際數據。舉個例子A向B發送數據,首先要建立連接,如何建立連接呢,它首先得知道B的位置吧,也就是主機地址,然后要知道從哪個門進去吧,也就是端口號,當知道這些之后它還需要知道B要不要接收它發過來的數據吧,也就是是否滿足某種協議,于是A發送一個不含任何數據的請求報文給B來試探B 讓不讓發送數據,如果B在接收到這個請求之后做出了回應,那么A隨后才發送實際數據。
(2)全雙工、點對點:如果兩個主機上的進程建立好連接,那么數據就可以從A發送到B,也可以從B發送到A,點對點指的是一個TCP連接是兩者之間的,不允許第三者插足,通過一個連接將數據發給多個接收方是不可能的。
(3)保證各數據到達的順序:建立連接后,數據的發送一定能夠到達,并且是有序的,發送的時候是ABC,接收的時候一定是ABC
(4)傳輸的數據無消息邊界:說的是不能保證來自單個Send方法的數據能被單個Receive方法讀取。舉個例子:
?第一次發送:abcdefg?? 第二次發送:123456???????? 接收方接收數據時,可能會出現以下情況:
? 第一次接收:abcdefg123456?? 也可能出現:第一次接收:abc 第二次接收:efg12 第三次接收:3456
? 因此要解決TCP發送消息與接收消息一致性,編程時必須要解決消息邊界問題。
?????? 三種方式解決傳輸無消息邊界問題:
?????? 第一種方法是發送固定長度的消息。該方法適用于消息長度固定的場合。
???????第二種方法是將消息長度與消息一起發送。
第三種方法是使用特殊標記分隔消息。
3、套接字SOCKET?????????????????????????????????????????????????????
???? Windows Sockets以UNIX中流行的Socket接口為范例定義了一套Microsoft Windows網絡編程接口。Windows Sockets規范旨在提供給應用程序開發人員一套簡單的API,并讓各家網絡軟件供應商共同遵守。Windows Sockets 1.1和Berkeley Sockets都是基于TCP/IP協議的;Windows Sockets 2從Windows Sockets 1.1發展而來,與協議無關并向下兼容,可以使用任何底層傳輸協議提供的通信能力,來為上層應用程序完成網絡數據通信,而不用關心底層網絡鏈路通信的情況,真正實現了底層網絡通信對應用程序的透明。
???? 套接字有兩種不同的類型:流套接字和數據報套接字。
TCP/IP的Socket則提供3種類型的套接字
????? (1)流式套接字(SOCK_STREAM)
?????? 提供面向連接、可靠的數據傳輸服務,數據無差錯、無重復的發送,且按發送順序接收。內設流量控制,避免數據流超限;數據被看作是字節流,無長度限制。文件傳輸 ?????? 協議(FTP)即使用流式套接字。
(2)數據報式套接字(SOCK_DGRAM)
?????? 提供無連接服務。數據包以獨立包形式發送,不提供無差錯保證,數據可能丟失或重復,并且接收順序混亂。網絡文件系統(NFS)使用數據報式套接字。
(3)原始套接字(SOCK_RAW)
?????? 該接口允許對較低層協議,如IP、ICMP直接訪問。常用于檢驗新的協議實現或訪問現有服務中配置的新設備。
套接字編程原理
?????? 服務器端程序執行步驟如下。
(1)打開一個通信通道并告知本地主機,它愿意在某一地址和端口上接收客戶請求。
(2)等待客戶請求到達該端口。
(3)接收到重復服務請求,處理該請求并發送應答信號。接收到并發服務請求,激活一個新的進程(或線程)來處理這個客戶請求。新進程(或線程)處理此客
?????? 戶請求, 并不需要對其他請求作出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止。
(4)返回第二步,等待另一客戶請求。
(5)關閉服務器。
????? 根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認
(1)服務器監聽
?????? 服務器監聽時服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態。
(2)客戶端請求
????? 客戶端請求是指由客戶端的套接字發出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端
套 接字的地址和端口號,然后再向服務器端套接字提出連接請求。
(3)連接確認
?????? 連接確認是指當服務器端套接字監聽到(或接收到)客戶端套接字的連接請求時,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客
戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
以上復制了一大堆,說白了套接字Socket提供的是應用程序和傳輸層的接口,在這個口外口內我們不需要知道它們干了什么,那是其他層的工作。
.NET程序集提供了兩個類對套接字進行了封裝:TcpClient? 和? TcpListener
從上面圖中可以看出TcpClient和TcpListener對套接字進行了封裝。從中也可以看出,TcpListener用于接受連接請求,而TcpClient則用于接收和發送流數據。這幅圖的意思是TcpListener持續地保持對端口的偵聽,一旦收到一個連接請求后,就可以獲得一個TcpClient對象,而對于數據的發送和接收都有TcpClient去完成。此時,TcpListener并沒有停止工作,它始終持續地保持對端口的偵聽狀態。
我們考慮這樣一種情況:兩臺主機,主機A和主機B,起初它們誰也不知道誰在哪兒,當它們想要進行對話時,總是需要有一方發起連接,而另一方則需要對本機的某一端口進行偵聽。而在偵聽方收到連接請求、并建立起連接以后,它們之間進行收發數據時,發起連接的一方并不需要再進行偵聽。因為連接是全雙工的,它可以使用現有的連接進行收發數據。而我們前面已經做了定義:將發起連接的一方稱為客戶端,另一段稱為服務端,則現在可以得出:總是服務端在使用TcpListener類,因為它需要建立起一個初始的連接。
在上面的鏈接中有對聊天的三種模式詳細介紹
?
轉載于:https://www.cnblogs.com/chenyongblog/p/3343567.html
總結
- 上一篇: 【Android】Handler详解
- 下一篇: cq01