一、服務器端
1. 實例化并設置socket實例對象
a.創(chuàng)建ip地址和端口
b.綁定監(jiān)聽地址
c.設置一下允許同時訪問數(shù)
2. 監(jiān)聽連接
a.通過啟動一個新的線程執(zhí)行,這樣主線程不會假死(啟動線程,所帶的參數(shù)必須是object類型)
b.利用循環(huán)等待連接并返回一個負責通信的socket實例
c.返回的socket實例中可以獲取到所連接客服的IP地址
3. 接收客服的發(fā)送過來的消息
a.在監(jiān)聽方法中啟動一個新的線程執(zhí)行
b.利用循環(huán)獲取發(fā)送過來的消息,調(diào)用獲取消息的方法需要傳遞一個字節(jié)變量參數(shù),作為容器。方法返回值為int,表示獲取到的有效字節(jié)數(shù)
c.如果有效字節(jié)數(shù)為0則跳出循環(huán)
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綁定監(jiān)聽地址   serverSocket.Bind(point);   Console.WriteLine("Listen Success");   //設置同時連接個數(shù)   serverSocket.Listen(10);   //利用線程后臺執(zhí)行監(jiān)聽,否則程序會假死   Thread thread = new Thread(Listen);   thread.IsBackground = true;   thread.Start(serverSocket);   Console.Read();  }  /// <summary>  /// 監(jiān)聽連接  /// </summary>  /// <param name="o"></param>  static void Listen(object o)  {   var serverSocket = o as Socket;   while (true)   {    //等待連接并且創(chuàng)建一個負責通訊的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)   {    //獲取發(fā)送過來的消息容器    byte[] buffer = new byte[1024 * 1024 * 2];    var effective = send.Receive(buffer);    //有效字節(jié)為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.創(chuàng)建ip地址和端口(服務器的IP和端口)
b.與服務器端建立鏈接
2. 接收服務器發(fā)送的消息
a.啟動一個新的線程執(zhí)行
b.利用循環(huán)獲取發(fā)送過來的消息,調(diào)用獲取消息的方法需要傳遞一個字節(jié)變量參數(shù),作為容器。方法返回值為int,表示獲取到的有效字節(jié)數(shù)
c.如果有效字節(jié)數(shù)為0則跳出循環(huán)
3. 給服務器發(fā)送消息
a. 調(diào)用socket對象的send()方法直接發(fā)送
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!");   //創(chuàng)建實例   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);      //不停的接收服務器端發(fā)送的消息   Thread thread = new Thread(Recive);   thread.IsBackground = true;   thread.Start(socketClient);   //不停的給服務器發(fā)送數(shù)據(jù)   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)   {    //獲取發(fā)送過來的消息    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);   }  } }}以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點
疑難解答