服務端:
public class SocketTest
{
private string _ip = string.Empty;
private int _port = 0;
private Socket _socket = null;
private byte[] buffer = new byte[1024 * 1024 * 2];
/// <summary>
/// 構造函數
/// </summary>
/// <param name="ip">監聽的IP</param>
/// <param name="port">監聽的端口</param>
public SocketTest(string ip, int port)
{
this._ip = ip;
this._port = port;
}
public SocketTest(int port)
{
this._ip = "0.0.0.0";
this._port = port;
}
public void StartListen()
{
try
{
//1.0 實例化套接字(IP4尋找協議,流式協議,TCP協議)
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.0 創建IP對象
IPAddress address = IPAddress.Parse(_ip);
//3.0 創建網絡端口,包括ip和端口
IPEndPoint endPoint = new IPEndPoint(address, _port);
//4.0 綁定套接字
_socket.Bind(endPoint);
//5.0 設置最大連接數
_socket.Listen(int.MaxValue);
writeLog.AddLogCanDelete("監聽" + _socket.LocalEndPoint.ToString() + "消息成功");
//6.0 開始監聽
Thread thread = new Thread(ListenClientConnect);
thread.Start();
}
catch (Exception ex)
{
}
}
/// <summary>
/// 監聽客戶端連接
/// </summary>
private void ListenClientConnect()
{
try
{
while (true)
{
//Socket創建的新連接
Socket clientSocket = _socket.Accept();
clientSocket.Send(Encoding.UTF8.GetBytes("服務端發送消息:"));
Thread thread = new Thread(ReceiveMessage);
thread.Start(clientSocket);
}
}
catch (Exception)
{
}
}
/// <summary>
/// 接收客戶端消息
/// </summary>
/// <param name="socket">來自客戶端的socket</param>
private void ReceiveMessage(object socket)
{
Socket clientSocket = (Socket)socket;
while (true)
{
try
{
//獲取從客戶端發來的數據
int length = clientSocket.Receive(buffer);
writeLog.AddLogCanDelete("接收客戶端" + clientSocket.RemoteEndPoint.ToString() + ",消息" + Encoding.UTF8.GetString(buffer, 0, length));
}
catch (Exception ex)
{
writeLog.AddLogCanDelete(ex.Message);
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
break;
}
}
}
}
客戶端:
public class SocketTest
{
private string _ip = string.Empty;
private int _port = 0;
private Socket _socket = null;
private byte[] buffer = new byte[1024 * 1024 * 2];
/// <summary>
/// 構造函數
/// </summary>
/// <param name="ip">連接服務器的IP</param>
/// <param name="port">連接服務器的端口</param>
public SocketTest(string ip, int port)
{
this._ip = ip;
this._port = port;
}
public SocketTest(int port)
{
this._ip = "127.0.0.1";
this._port = port;
}
/// <summary>
/// 開啟服務,連接服務端
/// </summary>
public void StartClient()
{
try
{
//1.0 實例化套接字(IP4尋址地址,流式傳輸,TCP協議)
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.0 創建IP對象
IPAddress address = IPAddress.Parse(_ip);
//3.0 創建網絡端口包括ip和端口
IPEndPoint endPoint = new IPEndPoint(address, _port);
//4.0 建立連接
_socket.Connect(endPoint);
Console.WriteLine("連接服務器成功");
//5.0 接收數據
//int length = _socket.Receive(buffer);
//Console.WriteLine("接收服務器{0},消息:{1}", _socket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(buffer, 0, length));
//6.0 像服務器發送消息
for (int i = 0; i < 10; i++)
{
Thread.Sleep(200);
string sendMessage = string.Format("客戶端發送的消息,當前時間{0}", DateTime.Now.ToString());
_socket.Send(Encoding.UTF8.GetBytes(sendMessage));
//Console.WriteLine("像服務發送的消息:{0}", sendMessage);
}
}
catch (Exception ex)
{
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
Console.WriteLine(ex.Message);
}
Console.WriteLine("發送消息結束");
}
}
一 、Socket概念
Socket並不是一種協議,而是為了方便使用TCP和UDP而抽象出來的一層,位於應用層和傳輸控制層之間的一組接口。
當兩台主機通信時,必須通過Socket連接,Socket則利用TCP/IP協議建立TCP連接,TCP連接則更依賴於底層的IP協議,Socket是控制層傳輸協議。
二、網絡通信的三要素
1. IP地址(網絡上主機設備的唯一標識)
2.端口號(定位程序)。有效端口:0~65535,其中0~1024由系統使用,開發中一般使用1024以上的端口。
3.傳輸協議(用什么樣的方式進行交互)。常見協議:TCP(面向連接,提供可靠的服務),UDP(無連接,傳輸速度快)
三、Socket通信流程

四、C#中Socket的簡單實用步驟
1.服務端監聽某個端口
2.客戶端向服務端地址和端口發起Socket請求
3.服務器接收連接請求后創建Socket連接,並維護這個連接隊列
4.客戶端和服務端就建立起了雙工通信,客戶端與服務端就可以實現彼此發送消息。
轉載於:https://blog.csdn.net/qq_33022911/article/details/82432778
