一、Socket編程
Socket即為套接字,它其實是一個句柄,存在于內存中的一個標識符,作為網絡通信的一個符號。
Socket類位于System.Net.Sockets命名空間,封裝了與套接字編程相關的API,其內部調用了與WInsock相關的WIn32 API。
網絡通信至少有兩個通信終端,一般來說,監聽并接受連續的一端稱為服務器,而發送請求的一方稱為客戶端。
二、Socket類的使用步驟
1、服務器
(1)實例化Socket對象。
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, PRotocolType.Tcp);(2)調用Bind方法綁定本地終結點。需要指定一個本地ip地址和一個本地端口,Socket將在該終結點上監聽傳入的客戶端連接。(注意綁定餓端口號必須為系統暫未分配的,否則指定端口號無效,無法建立連接)
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8622);server.Bind(endpoint);(3)調用Listen方法開始監聽客戶端連接。
server.Listen(15);(4)調用Accept相關方法接收連接,并返回一個用于與客戶端進行通信的Socket實例。
server.BeginAccept(new AsyncCallback(Accpcallback), server);private static void Accpcallback(IAsyncResult ar) { Socket server = (Socket)ar.AsyncState; Socket client = server.EndAccept(ar); string remoteendpoint = client.RemoteEndPoint.ToString(); Console.WriteLine("已接受客戶端【0】的連接。" + remoteendpoint); byte[] data = Encoding.UTF8.GetBytes("您好,服務器已經接受連接了。"); int len = data.Length; client.Send(BitConverter.GetBytes(len)); client.Send(data); client.Close(); Console.ReadLine(); server.BeginAccept(new AsyncCallback(Accpcallback), server); }(5)通過Send方法和Recieve方法進行收發數據。(6)通信結束后調用Close關閉Socket對象。
2、客戶端
(1)實例化Socket。
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);(2)調用Connect方法進行連接,需要指定服務器的地址和端口,服務器的端口必須與服務器綁定的監聽端口一致,否則無法連接。
client.Connect("127.0.0.1", 8622);(3)調用Send和Recieve方法收發數據。對于未進行連接的Socket對象,可以使用RecieveFrom和SendTo來進行通信。(4)通信結束后關閉Socket對象。
3、連接示意圖
三、服務器,客戶端源代碼
客戶端:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace tcpclient{ class Program { static void Main(string[] args) { Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { client.Connect("127.0.0.1", 8622); string remoteendpoint = client.RemoteEndPoint.ToString(); Console.WriteLine("成功連接服務器【0】。" + remoteendpoint); byte[] buffer = new byte[4]; client.Receive(buffer); int len = BitConverter.ToInt32(buffer, 0); buffer = new byte[len]; client.Receive(buffer); string msg = Encoding.UTF8.GetString(buffer); Console.WriteLine("從服務器接收到消息:/n" + msg); Console.ReadLine(); } catch (SocketException ex) { Console.WriteLine(ex.Message); } } }}服務器using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace tcpserver{ class Program { static void Main(string[] args) { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8622); server.Bind(endpoint); server.Listen(15); server.BeginAccept(new AsyncCallback(Accpcallback), server); Console.ReadLine(); } private static void Accpcallback(IAsyncResult ar) { Socket server = (Socket)ar.AsyncState; Socket client = server.EndAccept(ar); string remoteendpoint = client.RemoteEndPoint.ToString(); Console.WriteLine("已接受客戶端【0】的連接。" + remoteendpoint); byte[] data = Encoding.UTF8.GetBytes("您好,服務器已經接受連接了。"); int len = data.Length; client.Send(BitConverter.GetBytes(len)); client.Send(data); client.Close(); Console.ReadLine(); server.BeginAccept(new AsyncCallback(Accpcallback), server); } }}源碼下載地址:http://download.csdn.net/detail/kevin_iot/9749747
注意:以上為兩個項目,必須兩個項目全部運行才能完成客戶端與服務端的連接
如何同時建立兩個項目?在已有的項目基礎上,右鍵解決方案,新建新的項目。
如何同時運行多個項目?打開解決方案屬性窗口,把啟動方式改為“多啟動項目”,并且將兩個項目都標記為“啟動”。
如何驗證程序的執行步驟?設置斷電,一步步執行,看執行步驟是否為示意圖所示。
運行結果
參考文章:
C#網絡編程基本字段——IPAddress、IPEndPoint
C#編程筆記
C#Socket簡單例子(服務器與客戶端通信)
參考書籍:
C#6.0 學習筆記
新聞熱點
疑難解答