C# Socket 簡單的控制檯案例
阿新 • • 發佈:2021-08-12
一、伺服器端
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); } } } }