P:網絡層協議;
TCP和UDP:傳輸層協議;
HTTP:應用層協議;
SOCKET:TCP/IP網絡的API。
TCP/IP代表傳輸控制協議/網際協議,指的是一系列協議。
TCP和UDP使用IP協議從一個網絡傳送數據包到另一個網絡。把IP想像成一種高速公路,它允許其它協議在上面行駛并找到到其它電腦的出口。TCP和UDP是高速公路上的“卡車”,它們攜帶的貨物就是像HTTP,文件傳輸協議FTP這樣的協議等。
TCP和UDP是FTP,HTTP和SMTP之類使用的傳輸層協議。雖然TCP和UDP都是用來傳輸其他協議的,它們卻有一個顯著的不同:TCP提供有保證的數據傳輸,而UDP不提供。這意味著TCP有一個特殊的機制來確保數據安全的不出錯的從一個端點傳到另一個端點,而UDP不提供任何這樣的保證。
HTTP(超文本傳輸協議)是利用TCP在兩臺電腦(通常是Web服務器和客戶端)之間傳輸信息的協議。客戶端使用Web瀏覽器發起HTTP請求給Web服務器,Web服務器發送被請求的信息給客戶端。
記住,需要IP協議來連接網絡;TCP是一種允許我們安全傳輸數據的機制,,使用TCP協議來傳輸數據的HTTP是Web服務器和客戶端使用的特殊協議。
Socket 接口是TCP/IP網絡的API,Socket接口定義了許多函數或例程,用以開發TCP/IP網絡上的應用程序。
#的網絡編程和Socket通信 網絡編程是指利用計算機網絡進行數據交換和通信的編程。C#作為一種現代的、面向對象的、多范式的編程語言,提供了豐富的網絡編程功能和類庫,可以方便地實現各種網絡應用和協議。本文將介紹C#中最基本和最常用的網絡編程技術——Socket通信。
Socket(套接字)是一種抽象的概念,它表示兩個網絡節點之間的一個雙向的、可靠的、持久的通信鏈路。Socket是網絡編程中最底層的接口,它可以支持不同的傳輸層協議,如TCP(傳輸控制協議)和UDP(用戶數據報協議)。TCP是一種面向連接的、可靠的、有序的、基于字節流的協議,它適合于傳輸大量的數據,如文件、郵件、網頁等。UDP是一種無連接的、不可靠的、無序的、基于數據報的協議,它適合于傳輸少量的數據,如音頻、視頻、游戲等。
在C#中,Socket類位于System.Net.Sockets命名空間中,它封裝了操作系統提供的底層Socket接口,并提供了一些高級的方法和屬性,使得我們可以方便地創建和使用Socket對象。Socket類有以下幾個重要的屬性:
TCP通信需要有一個服務器端和一個客戶端。服務器端負責監聽來自客戶端的連接請求,并為每個連接請求創建一個新的Socket對象,用于與客戶端進行數據交換。客戶端負責發起連接請求,并使用一個Socket對象與服務器進行數據交換。下面給出一個簡單的示例,演示如何使用Socket進行TCP通信。
服務器端代碼:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpServer
{
class Program
{
static void Main(string[] args)
{
// 創建一個TCP Socket對象
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 綁定到本地IP地址和端口號
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;
IPEndPoint endPoint = new IPEndPoint(ip, port);
server.Bind(endPoint);
// 開始監聽
server.Listen(10);
Console.WriteLine("服務器已啟動,等待客戶端連接...");
// 循環接受客戶端連接請求
while (true)
{
// 接受一個客戶端連接請求,并返回一個新的Socket對象
Socket client = server.Accept();
Console.WriteLine("客戶端已連接,IP地址和端口號為:{0}", client.RemoteEndPoint);
// 創建一個字節數組,用于接收和發送數據
byte[] buffer = new byte[1024];
// 接收客戶端發送的數據
int length = client.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收到客戶端的數據:{0}", message);
// 向客戶端發送數據
message = "你好,我是服務器。";
buffer = Encoding.UTF8.GetBytes(message);
client.Send(buffer);
Console.WriteLine("向客戶端發送數據:{0}", message);
// 關閉客戶端Socket
client.Close();
}
// 關閉服務器Socket
server.Close();
}
}
客戶端代碼:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpClient
{
class Program
{
static void Main(string[] args)
{
// 創建一個TCP Socket對象
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 連接到服務器
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;
IPEndPoint endPoint = new IPEndPoint(ip, port);
client.Connect(endPoint);
Console.WriteLine("已連接到服務器,IP地址和端口號為:{0}", client.RemoteEndPoint);
// 創建一個字節數組,用于接收和發送數據
byte[] buffer = new byte[1024];
// 向服務器發送數據
string message = "你好,我是客戶端。";
buffer = Encoding.UTF8.GetBytes(message);
client.Send(buffer);
Console.WriteLine("向服務器發送數據:{0}", message);
// 接收服務器發送的數據
int length = client.Receive(buffer);
message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收到服務器的數據:{0}", message);
// 關閉客戶端Socket
client.Close();
}
}
}
運行結果:
從上面的示例可以看出,使用Socket進行TCP通信的基本步驟如下:
UDP通信不需要建立連接,只需要知道對方的IP地址和端口號即可。UDP通信有一個發送方和一個接收方。發送方負責向指定的遠程端點發送數據。接收方負責監聽來自任意遠程端點的數據。下面給出一個簡單的示例,演示如何使用Socket進行UDP通信。
發送方代碼:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UdpSender
{
class Program
{
static void Main(string[] args)
{
// 創建一個UDP Socket對象
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 創建一個遠程端點,表示接收方的IP地址和端口號
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 9999;
IPEndPoint endPoint = new IPEndPoint(ip, port);
// 創建一個字節數組,用于發送數據
byte[] buffer = new byte[1024];
// 向遠程端點發送數據
string message = "你好,我是發送方。";
buffer = Encoding.UTF8.GetBytes(message);
sender.SendTo(buffer, endPoint);
Console.WriteLine("向遠程端點發送數據:{0}", message);
// 關閉發送方Socket
sender.Close();
}
}
}
接收方代碼:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UdpReceiver
{
class Program
{
static void Main(string[] args)
{
// 創建一個UDP Socket對象
Socket receiver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 綁定到本地IP地址和端口號
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 9999;
IPEndPoint endPoint = new IPEndPoint(ip, port);
receiver.Bind(endPoint);
// 創建一個字節數組,用于接收數據
byte[] buffer = new byte[1024];
// 接收來自任意遠程端點的數據,并返回發送方的端點信息
EndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0);
int length = receiver.ReceiveFrom(buffer, ref senderEndPoint);
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收到來自{0}的數據:{1}", senderEndPoint, message);
// 關閉接收方Socket
receiver.Close();
}
}
}
運行結果:
接收到來自127.0.0.1:8888的數據:你好,我是發送方。
向遠程端點發送數據:你好,我是接收方。
從上面的示例可以看出,使用Socket進行UDP通信的基本步驟如下:
總結 本文介紹了C#中最基本和最常用的網絡編程技術——Socket通信。我們了解了什么是Socket,以及如何使用Socket進行TCP和UDP通信。我們還給出了一些簡單的示例代碼,演示了如何使用Socket類創建和使用Socket對象。通過學習本文,我們可以掌握C#中網絡編程的基礎知識,為進一步學習更高級的網絡編程技術打下堅實的基礎。
希望本文對你有所幫助。如果你有任何問題或建議,請在評論區留言。謝謝!
1.socket本身有“插座“的意思,因此用來描述網絡連接的一對一關系。
2.在TCP/IP協議中,“IP地址+TCP/UDP端口號”唯一標識網絡通信中的一個進程,“IP地址+端口號”就稱為socket。
3.在TCP協議中,建立連接的兩個進程各自有一個socket來標識,那么這兩個socket組成的socketpair 就唯一標志一個連接。
網絡數據流有大端和小端之分。發送主機通常將發送緩沖區中的數據按內存地址從高到低的順序 發出,接收主機把從網絡上接到的字節依次保存在接收緩沖區中,也是按內存地址從低到高的順序保存。因此 ,網絡數據流的地址應這樣規定:先發出的數據都是低地址,后發出的數據是高地址。
TCP/IP協議規定:網絡數據流應采用大端字節序,即低地址高字節。
如果發送主機是小端字節序的,則需要做相應的字節序的轉換。為使網絡程序具有可移植性,使代碼在大端和小端計算機上都能正常運行,可以調用以下庫函數做網絡字節序和主機字節序的轉換。
其中h表示host,n表示network,l表示32位長整數,s表示16位短整數。例如:htonl表示將32位的長整數從主機字節序轉換為網絡字節序。
服務器:調用socket(),bind(),listen()完成初始化以后,調用accept()阻塞等待,處于監聽端口的狀態。
客戶端:調用socket()初始化后,調用connect()發出SYN段并阻塞等待服務器應答,服務器應答一個SYN-ACK段,客戶端收到后從connect()返回,同時應答一個ACK段,服務器收到后從accept()返回。
數據傳輸的過程:建立連接后,TCP協議提供全雙工的通信服務,但是一般的客戶端/服務器程序的流程是由客戶端主動發起請求,服務器被動處理請求,一問一答的方式。因此,服務器從accept()返回后立即調用read(),讀socket就像讀管道一樣,如果沒有數據到達就阻塞等待,這時客戶端調用write()發送請求給服務器,服務器收到后從read()返回,對客戶端的請求進行處理,在此期間客戶端調用read()阻塞等待服務器的應答,服務器調用write()將處理結果發送給客戶端,再次調用read()阻塞等待下一條請求,客戶端收到后從read() 返回,發送下一條請求,如此循環下去。
如果客戶端沒有更多的請求,就調用close()關閉連接,就如同寫端關閉的管道一樣,服務器的read()返回0,服務器就知道客戶端關閉了連接,也調用close()關閉連接。注意:?任何一方調用close()后,連接的兩個傳輸方向都關閉,不能再發送數據了。如果一方調用shutdown()則連接處于半關閉狀態,仍可接受對方發送來的 數據。
1.socket的創建
(1)函數原型:
(2)參數說明:
domain為協議域,對于IPv4,family指定參數為AF_INET。
type 為指定socket的類型,對于TCP協議,type的參數指定為SOCK_STREAM,表示面向流的傳輸協議;如果是UDP協議,則type的參數指定為SOCK_DGRAM,表示面向數據報的傳輸協議。
protocal參數為指定協議,一般指定為0即可。
(3)返回值
*請認真填寫需求信息,我們會在24小時內與您取得聯系。