c# TCP/IP協議利用Socket Client通訊(只含客戶端Demo)

徹底是基礎,新手能夠隨意看看,大牛能夠關閉瀏覽頁了,哈哈。

TCP/IP協議

TCP/IP是一系列網絡通訊協議的統稱,其中最核心的兩個協議是TCP和IP。TCP稱爲傳輸控制協議,IP稱爲互聯網絡協議。c#

網絡分層除了OSI模型分層,還有TCP/IP模型分層,將網絡劃分爲四層,應用層、傳輸層、網際層、網絡接口層。TCP/IP模型分層是OSI模型分層的濃縮版服務器

OSI模型和TCP/IP網絡分層的對應結構及TCP/IP部分協議族,網絡

 

TCP三次握手

第一次握手:創建鏈接。客戶端發送鏈接請求報文段,將SYN位置爲1,Sequence Number爲x;而後,客戶端進入SYN_SEND狀態,等待服務器的確認;
第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,須要對這個SYN報文段進行確認,設置Acknowledgment Number爲x+1(Sequence Number+1);同時,本身本身還要發送SYN請求信息,將SYN位置爲1,Sequence Number爲y;服務器端將上述全部信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK報文段。而後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。併發

三次握手圖解
socket

在此基礎上,socket鏈接過程:學習

服務器監聽:服務器端socket並不定位具體的客戶端socket,而是處於等待監聽狀態,實時監控網絡狀態。server

客戶端請求:客戶端clientSocket發送鏈接請求,目標是服務器的serverSocket。爲此,clientSocket必須知道serverSocket的地址和端口號,進行掃描發出鏈接請求。blog

鏈接確認:當服務器socket監聽到或者是受到客戶端socket的鏈接請求時,服務器就響應客戶端的請求,建議一個新的socket,把服務器socket發送給客戶端,一旦客戶端確認鏈接,則鏈接創建。接口

注:在鏈接確認階段:服務器socket即便在和一個客戶端socket創建鏈接後,還在處於監聽狀態,仍然能夠接收到其餘客戶端的鏈接請求,這也是一對多產生的緣由。ip

socket鏈接原理知道了,此處編寫最基本最簡單的socket通訊:

客戶端Demo:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;


        /// <summary>
        /// Socket客戶端Demo
        /// </summary>
        /// <param name="sendStr">發送數據和指令</param>
        /// <returns>接收數據和指令</returns>
        public string SetSocket(string sendStr)
        {
            string recStr = "";
            Task<string> yourTask = new Task<string>(() =>
            {
                try
                {
                    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(IPAddres), EndPoints);//IPAddres:IP地址;EndPoints:端口號
                    Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    clientSocket.Connect(ipe);

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

                    //receive message

                    byte[] recBytes = new byte[4096];
                    int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0);
                    recStr += Encoding.ASCII.GetString(recBytes, 0, bytes);
                    clientSocket.Close();
                    return recStr;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            });
            yourTask.Start();
            return yourTask.Result;
        }       

  注:c#新手的隨手筆記,方便之後學習和使用,若有不足和雷同,歡迎留言!謝謝!

相關文章
相關標籤/搜索