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(); } }