C# 實現socket通訊程式(伺服器端)

Cheney-渣渣傑發表於2019-06-20

上一篇說的是客戶端https://blog.csdn.net/cj151525/article/details/93061212,那麼這篇就要聊聊伺服器端的程式設計了。具體的計算機網路基礎知識請參考這個網站:https://www.cnblogs.com/dotnet261010/p/6211900.html

先看張原理圖:

伺服器端:

第一步:建立一個用於監聽連線的Socket對像;

第二步:用指定的埠號和伺服器的ip建立一個EndPoint對像;

第三步:用socket對像的Bind()方法繫結EndPoint;

第四步:用socket對像的Listen()方法開始監聽;

第五步:接收到客戶端的連線,用socket對像的Accept()方法建立一個新的用於和客戶端進行通訊的socket對像;

第六步:通訊結束後一定記得關閉socket;

伺服器與客戶端不同,伺服器要開兩個執行緒一個用於監聽連線,一個用於監聽客戶端資訊;還要有兩個socket,一個用於監聽,一個用於通訊。服務端的主要職責是處理各個客戶端傳送來的資料,因此在客戶端的Socket程式設計中需要使用兩個執行緒來迴圈處理客戶端的請求,一個執行緒用於監聽客戶端的連線情況,一個執行緒用於監聽客戶端的訊息傳送。

基本流程

•     建立套接字

•     繫結套接字的IP和埠號——Bind(EndPoint)

•      將套接字處於監聽狀態等待客戶端的連線請求——Listen(int) 監聽埠,其中 int 表示最大監聽數。

•      阻塞方法,當請求到來後,接受請求並返回本次會話的套接字——Accept()接受客戶端連結,並返回一個新的連結,用於處理同客戶端的通訊問題。

•     使用返回的套接字和客戶端通訊——Send()/Receive()

       Send(byte[]) 簡單傳送資料。

       Send(byte[],SocketFlag)   使用指定的SocketFlag傳送資料。

       Send(byte[],int, SocketFlag)   使用指定的SocketFlag傳送指定長度資料。

        Send(byte[], int, int,SocketFlag)  使用指定的SocketFlag,將指定位元組數的資料傳送到已連線的socket(從指定偏移量開始)。

Receive(byte[])  簡單接受資料。

       Receive(byte[],SocketFlag)    使用指定的SocketFlag接受資料。

       Receive(byte[], int, SocketFlag)    使用指定的SocketFlag接受指定長度資料。

        Receive (byte[], int,int, SocketFlag)    使用指定的SocketFlag,從繫結的套接字接收指定位元組數的資料,並存到指定偏移量位置的緩衝區。

•     返回,再次等待新的連線請求

•     關閉套接字

 

客戶端:

客戶端相對於服務端來說任務要輕許多,因為客戶端僅僅需要和服務端通訊即可,可是因為在和伺服器通訊的過程中,需要時刻保持連線通暢,因此同樣需要兩個執行緒來分別處理連線情況的監聽和訊息傳送的監聽。

基本流程

•     建立套接字保證與伺服器的埠一致

•      向伺服器發出連線請求——Connect(EndPoint)連線遠端伺服器,如果沒有相應的遠端等待連線,直接返回錯誤。

•     和伺服器端進行通訊——Send()/Receive()

•     關閉套接字


服務端接收客戶端資訊並向客戶端返回資訊

服務端:

static void Main()

{

   try{

        IPEndPoint ipe = new IPEndPoint(IPAddress.Any,8001);

        Socket s = newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);//建立一個Socket類

        s.Bind(ipe);//繫結

        s.Listen(0);//開始監聽

        Socket temp = s.Accept();//等待客戶端連線

        byte[] recvBytes = new byte[1024];

        int bytes = temp.Receive(recvBytes);//從客戶端接受資訊,返回接收的資料長度

        string recvStr = Encoding.UTF8.GetString(recvBytes,0, bytes);

        Console.WriteLine("Server GetMessage:{0}", recvStr);

        string sendStr = "Ok!Client SendMessage Sucessful!";

        byte[] bs = Encoding.UTF8.GetBytes(sendStr);

        temp.Slend(bs);//向客戶端傳送資料

        temp.Close();

        s.Close();

      }

      catch (ArgumentNullException e){

            Console.WriteLine("ArgumentNullException:{0}", e);}

      catch (SocketException e){

           Console.WriteLine("SocketException: {0}", e);}

      Console.WriteLine("Press Enter to Exit");

      Console.ReadLine();

}

相關文章