Socket基礎二

1:什麼是Socket?
Socket又被稱之爲"套接字",是計算機之間通信的一種約定或者方式,通過這種約定,計算機之間可以相互發送數據。
2:本質是什麼?
實際上是對TCP/IP協議的封裝,它的出現方便了程序員使用TCP/IP協議棧,本身不是協議。可以看做是傳輸層和應用層之間抽象出來的一層,是一組調用接口(TCP/IP網絡的API函數) 

 

 

3 步驟

服務器端程序編寫的程序步驟:

第一:首先肯定是要先創建一個Socket套接字。
第二:客戶端想要連接到服務器上,必須要知道IP地址和端口號,根據端口號才能找到服務器上具體是哪個應用程序。使用Bind()方法來綁定IP和端口號(服務器端的端口號就是服務器端的應用程序所使用的的端口號,和客戶端沒關係)。一定要注意將服務器端的IP和端口進行綁定,否則客戶端根據IP和端口申請連接的時候會失敗。
第三:準備工作做好之後就要開始監聽,看看有哪些客戶端設備來連接服務器,通過Listen方法建立一個監聽序列,存在待處理的客戶連接。這個地方一定要搞清楚一件事,就是在監聽的時候必須設置一個時間點內最多能連接的數量,比如類似遊戲登錄的時候同一時間那麼多設備請求,不可能同時對所有的請求都進行迴應,必須設置一個迴應請求的最大上限,超過這個數量就排隊進行等待。比如網吧中有10臺電腦最多容納10個人連接網絡玩遊戲,但是這個網吧並不是只能容納10個人,超過10個人之後需要你站在旁邊等着,有人用完之後你才能用。
第四:監聽工作準備好之後就要開始處理監聽序列中的客戶連接信息了,通過accept方法實現。
第五:建立連接之後,通過receive和send來進行接收發送信息。
第六:關閉連接
代碼:

/// <summary>
    /// 簡單Socket服務端
    /// </summary>
    public class SimpleSocketServer
    {
        public static void Proccess()
        {
            int port = 2018;
            string host = "127.0.0.1";

            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);

            Socket sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sSocket.Bind(ipe);
            sSocket.Listen(0);
            Console.WriteLine("監聽已經打開,請等待");

            //收到消息  接受一個socket鏈接
            Socket serverSocket = sSocket.Accept();
            Console.WriteLine("連接已經建立。。。");
            while (true)
            {
                string recStr = "";
                byte[] recByte = new byte[4096];
                int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
                recStr += Encoding.ASCII.GetString(recByte, 0, bytes);
                Console.WriteLine("服務器端獲得信息:{0}", recStr);

                if (recStr.Equals("stop"))
                {
                    serverSocket.Close();//關閉該socket對象
                    Console.WriteLine("關閉鏈接。。。。");
                    break;
                }

                //回發消息
                Console.WriteLine("請輸入回發消息。。。。");
                string sendStr = Console.ReadLine(); //"send to client :hello world";
                byte[] sendByte = Encoding.ASCII.GetBytes(sendStr);
                serverSocket.Send(sendByte, sendByte.Length, 0);

            }
            sSocket.Close();//關閉server監聽
        }
    }

客戶端步驟:

第一:也是要創建Socket套接字,這是最基礎的準備工作。
第二:此時客戶端需要主動申請服務器的連接,通過connect方法實現,一定要寫對服務器的IP和端口號。
第三:申請成功之後,通過receive和send來進行通信。
第四:close()關閉連接。

代碼實現:

/// <summary>
    /// 發起socket請求
    /// 常使用的其實是Http請求; 單向,客戶端===服務器   請求響應式;
    /// socket==套接字,長鏈接、雙工通信,可以讓客戶單和服務器之間相互發送消息;
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("啓動一個Socket客戶端鏈接"); 
                int port = 2018;
                string host = "127.0.0.1";//服務器端ip地址 
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                //注意這裏: ProtocolType.Tcp表明是TCP連接,可以改成UDP連接: ProtocolType.Udp
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(ipe); //開啓鏈接以後,是長鏈接; 因爲沒有關閉,close方法在while(true)方法體之外, 一直保持連接,
                while (true)
                {
                    Console.WriteLine("請輸入發送到服務器的信息:");
                    string sendStr = Console.ReadLine();
                    if (sendStr == "exit")
                        break;

                    byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
                    clientSocket.Send(sendBytes);

                    //receive message
                    string recStr = "";
                    byte[] recBytes = new byte[4096];
                    //監控傳遞過來的消息;
                    int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0);
                    recStr += Encoding.ASCII.GetString(recBytes, 0, bytes);
                    Console.WriteLine($"服務器返回:{recStr}");
                }
                clientSocket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章