Socket的使用(簡單測試)


服務端:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM