C# Socket學習筆記一


小記:剛接觸網絡編程覺得網絡是個神奇的東西,所以對它就很有興趣,想了解下網絡是如何進行進行數據傳輸的,那么開始第一天的學習吧!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 TcpServer
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //確定端口號
16             int port = 6000;
17 
18             //設定連接IP
19             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                 //將接收到的字節抓獲年華為string
54                 //參數一:字節數組 參數二:起始索引 參數三:總長度
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 TcpClient
10 {
11     class Program
12     {
13         static int port = 6000;                          //監聽端口號
14         static string host = "127.0.0.1";                //連接服務端IP
15         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);//建立客戶端Socket
18        
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 }

下面是運行結果:

我們試一下是否可以對多個客戶端進行回應:

測試發現是可以同時回應多個客戶端的,一起努力,下節咱們學習異步加載數據!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM