這篇文章主要為大家分享了C# Socket簡單的控制台案例,具有一定的參考價值,感興趣的小夥伴們可以參考一下
一、伺服器端
1. 執行個體化並設定socket執行個體對象
a.建立ip地址和連接埠
b.綁定監聽地址
c.設定一下允許同時訪問數
2. 監聽串連
a.通過啟動一個新的線程執行,這樣主線程不會假死(啟動線程,所帶的參數必須是object類型)
b.利用迴圈等待串連並返回一個負責通訊的socket執行個體
c.返回的socket執行個體中可以擷取到所串連客服的IP地址
3. 接收客服的發送過來的訊息
a.在監聽方法中啟動一個新的線程執行
b.利用迴圈擷取發送過來的訊息,調用擷取訊息的方法需要傳遞一個位元組變數參數,作為容器。方法傳回值為int,表示擷取到的有效位元組數
c.如果有效位元組數為0則跳出迴圈
d.接收到訊息給客服的返回訊息
4. 控制台程式伺服器端代碼
using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace ServerSocket{ class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Socket serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Any; IPEndPoint point = new IPEndPoint(ip, 2333); //socket綁定監聽地址 serverSocket.Bind(point); Console.WriteLine("Listen Success"); //設定同時串連個數 serverSocket.Listen(10); //利用線程後台執行監聽,否則程式會假死 Thread thread = new Thread(Listen); thread.IsBackground = true; thread.Start(serverSocket); Console.Read(); } /// <summary> /// 監聽串連 /// </summary> /// <param name="o"></param> static void Listen(object o) { var serverSocket = o as Socket; while (true) { //等待串連並且建立一個負責通訊的socket var send = serverSocket.Accept(); //擷取連結的IP地址 var sendIpoint = send.RemoteEndPoint.ToString(); Console.WriteLine($"{sendIpoint}Connection"); //開啟一個新線程不停接收訊息 Thread thread = new Thread(Recive); thread.IsBackground = true; thread.Start(send); } } /// <summary> /// 接收訊息 /// </summary> /// <param name="o"></param> static void Recive(object o) { var send = o as Socket; while (true) { //擷取發送過來的訊息容器 byte[] buffer = new byte[1024 * 1024 * 2]; var effective = send.Receive(buffer); //有效位元組為0則跳過 if (effective == 0) { break; } var str = Encoding.UTF8.GetString(buffer,0, effective); Console.WriteLine(str); var buffers = Encoding.UTF8.GetBytes("Server Return Message"); send.Send(buffers); } } }}
二、用戶端
1. 執行個體化並進行串連socket執行個體對象
a.建立ip地址和連接埠(伺服器的IP和連接埠)
b.與伺服器端建立連結
2. 接收伺服器發送的訊息
a.啟動一個新的線程執行
b.利用迴圈擷取發送過來的訊息,調用擷取訊息的方法需要傳遞一個位元組變數參數,作為容器。方法傳回值為int,表示擷取到的有效位元組數
c.如果有效位元組數為0則跳出迴圈
3. 給伺服器發送訊息
a. 調用socket對象的send()方法直接發送
4. 控制台程式用戶端代碼
using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace SocketClient{ class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); //建立執行個體 Socket socketClient = new Socket(SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse("192.168.0.111"); IPEndPoint point = new IPEndPoint(ip, 2333); //進行串連 socketClient.Connect(point); //不停的接收伺服器端發送的訊息 Thread thread = new Thread(Recive); thread.IsBackground = true; thread.Start(socketClient); //不停的給伺服器發送資料 int i = 0; while (true) { i++; var buffter = Encoding.UTF8.GetBytes($"Test Send Message:{i}"); var temp = socketClient.Send(buffter); Thread.Sleep(1000); } } /// <summary> /// 接收訊息 /// </summary> /// <param name="o"></param> static void Recive(object o) { var send = o as Socket; while (true) { //擷取發送過來的訊息 byte[] buffer = new byte[1024 * 1024 * 2]; var effective = send.Receive(buffer); if (effective == 0) { break; } var str = Encoding.UTF8.GetString(buffer, 0, effective); Console.WriteLine(str); } } }}