c# TCP/IP协议利用Socket Client通信(只含客服端Demo)

时间:2019-08-22
本文章向大家介绍c# TCP/IP协议利用Socket Client通信(只含客服端Demo),主要包括c# TCP/IP协议利用Socket Client通信(只含客服端Demo)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈。

TCP/IP协议

TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP。TCP称为传输控制协议,IP称为互联网络协议。

网络分层除了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,而是处于等待监听状态,实时监控网络状态。

客户端请求:客户端clientSocket发送连接请求,目标是服务器的serverSocket。为此,clientSocket必须知道serverSocket的地址和端口号,进行扫描发出连接请求。

连接确认:当服务器socket监听到或者是受到客户端socket的连接请求时,服务器就响应客户端的请求,建议一个新的socket,把服务器socket发送给客户端,一旦客户端确认连接,则连接建立。

注:在连接确认阶段:服务器socket即使在和一个客户端socket建立连接后,还在处于监听状态,仍然可以接收到其他客户端的连接请求,这也是一对多产生的原因。

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#新手的随手笔记,方便以后学习和使用,如有不足和雷同,欢迎留言!谢谢!

原文地址:https://www.cnblogs.com/yxx24/p/11393640.html