標籤:讀取資料 通過 可靠 bind text 應用 重複數 建立串連 丟失
Socket相關概念[連接埠]
在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟體,同時提供幾種服務。每種服務都開啟一個Socket,並綁定到一個連接埠上,不同的連接埠對應於不同的服務(應用程式)。
例如:http 使用80連接埠 ftp使用21連接埠 smtp 25連接埠
有兩種類型:50000
? 流式Socket(STREAM):
是一種連線導向的Socket,針對於連線導向的TCP服務應用,安全,但是效率低;
? 資料報式Socket(DATAGRAM):
是一種不需連線的Socket,對應於不需連線的UDP服務應用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高.
連接埠用來標識電腦裡的某個程式。
按連接埠號碼可分為3大類
(1) 公認連接埠(WellKnownPorts):從0到1023,它們緊密綁定(binding)於一些服務。通常這些連接埠的通訊明確表明了某種服務的協議。例如:80連接埠實際上總是HTTP通訊。
(2) 註冊連接埠(RegisteredPorts):從1024到49151。它們鬆散地綁定於一些服務。也就是說有許多服務綁定於這些連接埠,這些連接埠同樣用於許多其它目的。例如:許多系統處理動態連接埠從1024左右開始。
(3) 動態和/或私人連接埠(Dynamicand/orPrivatePorts):從49152到65535。理論上,不應為服務分配這些連接埠。實際上,機器通常從1024起分配動態連接埠。
Socket一般應用模式(伺服器端和用戶端)
1.服務端welcoming socket 開始監聽連接埠(負責監聽用戶端串連資訊)
2.用戶端client socket串連服務端指定連接埠(負責接收和發送服務端訊息)
3.服務端welcoming socket 監聽到用戶端串連,建立connection socket。(負責和用戶端通訊)
伺服器端的Socket(至少需要兩個)
一個負責接收用戶端串連請求(但不負責與用戶端通訊)
每成功接收到一個用戶端的串連便在服務端產生一個對應的負責通訊的Socket
在接收到用戶端串連時建立.
為每個串連成功的用戶端請求在服務端都建立一個對應的Socket(負責和用戶端通訊).
用戶端的Socket
必須指定要已連線的服務端地址和連接埠。
通過建立一個Socket對象來初始化一個到伺服器端的TCP串連。
Socket的通訊過程
?伺服器端:
?申請一個socket
?綁定到一個IP地址和一個連接埠上
?開啟偵聽,等待接授串連
?用戶端:
?申請一個socket
?串連伺服器(指明IP地址和連接埠號碼)
?伺服器端接到串連請求後,產生一個新的socket(連接埠大於1024)與用戶端建立串連並進行通訊,原監聽socket繼續監聽。
Socket的建構函式
串連通過建構函式完成。
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
AddressFamily 成員指定 Socket 用來解析地址的定址方案。例如,InterNetwork 指示當 Socket 使用一個 IP 版本 4 地址串連。
SocketType 定義要開啟的 Socket 的類型
Socket 類使用 ProtocolType 枚舉向 Windows Sockets API 通知所請求的協議
如:mySocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
AddressFamily.InterNetWork:使用 IP4地址。
SocketType.Stream:支援可靠、雙向、基於串連的位元組流,而不重複資料。此類型的 Socket 與單個對方主機進行通訊,並且在通訊開始之前需要遠程主機串連。Stream 使用傳輸控制通訊協定 (Tcp) ProtocolType 和 InterNetworkAddressFamily。
ProtocolType.Tcp:使用傳輸控制通訊協定。
注意點:
l 至少要定義一個要串連的遠程主機的IP和連接埠號碼。
l 連接埠號碼必須在 1 和 65535之間,最好在1024以後。
l 要串連的遠程主機必須正在監聽指定連接埠,也就是說你無法隨意串連遠程主機。
? 如:
? IPAddress addr = IPAddress.Parse("127.0.0.1");
? IPEndPoint endp = new IPEndPoint(addr, 10001);
服務端先綁定:serverWelcomeSocket.Bind(endp)
用戶端再串連:clientSocket.Connect(endp)
l 一個Socket一次只能串連一台主機。
l Socket關閉後無法再次使用。
l 每個Socket對象只能一台遠程主機串連. 如果你想串連到多台遠程主機, 你必須建立多個Socket對象。
Socket方法:
------------------相關類--------------------------
?IPAddress類:包含了一個IP地址
?IPEndPoint類:包含了一對IP地址和連接埠號碼
--------------------方法們------------------------------
Socket (): 建立一個Socket
Bind(): 綁定一個本地的IP和連接埠號碼(IPEndPoint)
Listen(): 讓Socket偵聽傳入的串連嘗試,並指定偵聽隊列容量
Connect(): 初始化與另一個Socket的串連
Accept(): 接收串連並返回一個新的socket
Send(): 輸出資料到Socket
Receive(): 從Socket中讀取資料
Close(): 關閉Socket (銷毀串連)
Socket通訊基本流程圖
基於TCP的Socket編程
TCP service:可靠的位元組流傳輸
Socket原始碼:
連結:http://pan.baidu.com/s/1i3EX7lN 密碼:d148
轉自:http://www.cnblogs.com/Dr-Hao/p/4953532.html
【轉】Winform Socket通訊