標籤:des style blog io color ar os 使用 sp
小記:剛接觸網路編程覺得網路是個神奇的東西,所以對它就很有興趣,想瞭解下網路是如何進行進行資料轉送的,那麼開始第一天的學習吧!ReadyGo!!!
首先我們要瞭解一下幾點內容:
- 1、網路中進程之間如何通訊?
- 2、Socket是什嗎?
- 3、socket的基本操作
- 3.1、socket()函數
- 3.2、bind()函數
- 3.3、listen()、connect()函數
- 3.4、accept()函數
- 3.5、read()、write()函數等
- 3.6、close()函數
- 4、socket中TCP的三向交握建立串連詳解
- 5、socket中TCP的四次握手釋放串連詳解
- 6、一個例子
現階段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建立串連後,還在處於監聽狀態,仍然可以接收到其他用戶端的串連請求,這也是一對多產生的原因。
簡單說明串連過程:
下面開始進行程式碼分析了:
伺服器端:TcpServer.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.Net.Sockets; 8 9 namespace TcpServer10 {11 class Program12 {13 static void Main(string[] args)14 {15 //確定連接埠號碼16 int port = 6000;17 18 //設定串連IP19 string host = "127.0.0.1";20 21 //將IP地址字串轉化為IP地址執行個體22 IPAddress ip = IPAddress.Parse(host);23 24 //將網路端點表示為 IP 位址和連接埠號碼25 IPEndPoint ipe = new IPEndPoint(ip, port);26 27 //建立Socket 28 //addressFamily 參數指定 Socket 類使用的定址方案29 //socketType 參數指定 Socket 類的類型30 //protocolType 參數指定 Socket 使用的協議。 31 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);32 33 //socket與本地終結點建立關聯34 socket.Bind(ipe);35 while (true)36 {37 //開始監聽連接埠38 socket.Listen(0);39 40 Console.WriteLine("服務已開啟,請等待....."+ DateTime.Now.ToString());41 42 //為建立的串連建立新的Socket目的為用戶端將要建立串連43 Socket serverSocket = socket.Accept();44 Console.WriteLine("串連已建立......" + DateTime.Now.ToString());45 46 string recStr =string.Empty;47 //定義緩衝區用於接收用戶端的資料48 byte[] recbyte = new byte[1024];49 50 //返回接收到的位元組數51 int bytes = serverSocket.Receive(recbyte, recbyte.Length, 0);52 53 //將接收到的位元組抓獲年華為string54 //參數一:位元組數組 參數二:起始索引 參數三:總長度55 recStr += Encoding.ASCII.GetString(recbyte, 0, bytes);56 57 Console.WriteLine("伺服器接收到用戶端的資訊:" + recStr + " " + DateTime.Now.ToString()+"\n\n");58 59 60 //服務端給用戶端回送訊息61 string strSend = "Hello Client!";62 byte[] sendByte = new byte[1024];63 //將發送的字串轉換為byte[]64 sendByte = Encoding.ASCII.GetBytes(strSend);65 66 //服務端發送資料67 serverSocket.Send(sendByte, sendByte.Length, 0);68 69 serverSocket.Close();70 }71 }72 }
用戶端的代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net; 7 using System.Net.Sockets; 8 9 namespace TcpClient10 {11 class Program12 {13 static int port = 6000; //監聽連接埠號碼14 static string host = "127.0.0.1"; //串連服務端IP15 static IPAddress ip = IPAddress.Parse(host); //將IP地址轉換為IP執行個體16 static IPEndPoint ipe = new IPEndPoint(ip, port);//將網路端點表示為 IP 位址和連接埠號碼17 static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立用戶端Socket18 19 static void Main(string[] args)20 {21 22 clientSocket.Connect(ipe); //用戶端開始串連服務端23 24 25 string sendStr = "Hello,Server!"; //向伺服器發送訊息26 byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);27 clientSocket.Send(sendBytes);28 29 30 string revStr = ""; //接收來自伺服器的訊息31 byte[] revBytes = new byte[4096];32 int bytes = clientSocket.Receive(revBytes, revBytes.Length, 0);33 34 revStr += Encoding.ASCII.GetString(revBytes, 0, bytes);35 Console.WriteLine("來自服務端的回應:{0}",revStr);36 37 clientSocket.Close();38 }39 }40 }
下面是運行結果:
我們試一下是否可以對多個用戶端進行回應:
測試發現是可以同時回應多個用戶端的,一起努力,下節咱們學習非同步載入資料!
C# Socket學習筆記一