C#TCP传输协议

这篇具有很好参考价值的文章主要介绍了C#TCP传输协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 什么是TCP

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议
作用:CP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

2.Socket

c#一般是通过Socket实现UDP和TCP通讯,.NET框架通过UdpClient、TcpListener 、TcpClient这几个类对Socket进行了封装
套接字(Socket),是对网络中不同主机上的应用程序之间进行双向通信的断点的抽象,一个套接字就是网络上进程通信的一段,提供了应用层进程利用网络协议交换数据的机制。
实质就是,Socket就是应用层与TCP/IP协议族通信的中间软件抽象层。将传输层封装后便与应用层更方便的调用
c# tcp,tcp/ip,c#,网络

3. TCP建立连接的三次握手

c# tcp,tcp/ip,c#,网络
ACK:TCP报头的控制位之一,表示确认号是否有效。只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。
确认号:用它来告诉发送端发送过来的序列号之前的数据段都收到了。比如,确认号为X,则表示前X-1个数据段都收到了。
SYN:同步序列号,TCP建立连接时将这个位置1。
FIN:发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1

4. c#Tcp连接思路

详细分析见https://blog.csdn.net/qq_45060045/article/details/113360983
c# tcp,tcp/ip,c#,网络
TCP C# Socket 编程思路
1.创建一个负责监听Socket,创建Socket并填基本属性值(Socket())
2.创建IP地址和端口号对象 (IPEndAdress())
3.让负责监听的Socket绑定IP地址和端口号(Bind())
4.创建监听队列(监听队列就是某一时间能连接进的客户端的最大数量使用Listen())
5.创建接受负责监听的Socket,来接受客户端的连接,创建跟客户端通信的Socket使用函数Accept();
6.收发数据:使用函数read()和write(),用函数send()和recv()也可以
7.关闭服务端文章来源地址https://www.toymoban.com/news/detail-577033.html

5. 连接、发送、接收

5.1 服务器端建立侦听并等待连接

TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9000);
tcpListener.Start();
if (tcpListener.Pending())
{
          TcpClient client = tcpListener.AcceptTcpClient();//获取TcpClient对象
          Console.WriteLine("Connected");   
}

5.2 客户端创建TcpClient对象

TcpClient tcpClient = new TcpClient();
tcpClient.Connect("127.0.0.1", 9000);

5.3 发送数据

TcpClient tcpClient = new TcpClient();
                tcpClient.Connect("127.0.0.1", 9000);
                NetworkStream netStream = tcpClient.GetStream();

                int Len = 1024;
                byte[] datas = new byte[Len];

                netStream.Write(datas, 0, Len);               

                netStream.Close();
                tcpClient.Close();

5.4 接收数据

TcpClient client = tcpListener.AcceptTcpClient();
Console.WriteLine("Connected");  
  
  NetworkStream stream = client.GetStream();
  var remote = client.Client.RemoteEndPoint;

   byte[] data = new byte[1024];
   while (true)
   {
         if (stream.DataAvailable)
         {
                int len = stream.Read(data, 0, 1024);
                Console.WriteLine($"From:{remote}:Received ({len})");
          }
        Thread.Sleep(1);
 }

6. 完整代码

6.1 服务端

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

namespace TCPServer
{
    class Program
    {  
        static void Main(string[] args)
        {   
            TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9000);
            tcpListener.Start();

            while (true)
            {
                if (tcpListener.Pending())
                {
                    TcpClient client = tcpListener.AcceptTcpClient();
                    Console.WriteLine("Connected");                   

                    Task.Run(() =>
                    {  
                        NetworkStream stream = client.GetStream();
                        var remote = client.Client.RemoteEndPoint;
                      
                        while (true)
                        {
                            if (stream.DataAvailable)
                            {
                                byte[] data = new byte[1024];
                                int len = stream.Read(data, 0, 1024);
                                string Name = Encoding.UTF8.GetString(data,0,len);
                                var senddata = Encoding.UTF8.GetBytes("Hello:" + Name);
                                stream.Write(senddata, 0, senddata.Length);
                            }

                            if (!client.IsOnline())
                            {
                                Console.WriteLine("Connect Closed.");
                                break;
                            }

                            Thread.Sleep(1);
                        }
                    });
                }

                Thread.Sleep(1);
            }
        }
    }

    public static class TcpClientEx
    {
        public static bool IsOnline(this TcpClient client)
        {
            return !((client.Client.Poll(15000, SelectMode.SelectRead) && (client.Client.Available == 0)) || !client.Client.Connected);
        }
    }
}

6.2 客户端

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TCP_Clent
{
    class Program
    {
        static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(100, 100);
            ThreadPool.SetMaxThreads(200, 200); 

            Parallel.For(1, 10,  x =>
            {
                SendData("Tom");
            });

            Console.WriteLine("All Completed!");
            Console.ReadKey();
        }

        private static void SendData(string Name)
        {
            Task.Run(() =>
            {
                Console.WriteLine("Start");
                TcpClient tcpClient = new TcpClient();
                tcpClient.Connect("127.0.0.1", 9000);
                Console.WriteLine("Connected");
                NetworkStream netStream = tcpClient.GetStream();

                Task.Run(() =>
                {
                    Thread.Sleep(100);
                    while (true)
                    {
                        if (!tcpClient.Client.Connected)
                        {
                            break;
                        }

                        if (netStream == null)
                        {
                            break;
                        }

                        try
                        {
                            if (netStream.DataAvailable)
                            {
                                byte[] data = new byte[1024];
                                int len = netStream.Read(data, 0, 1024);
                                var message = Encoding.UTF8.GetString(data, 0, len);
                                Console.WriteLine(message);
                            }
                        }
                        catch
                        {
                            break;
                        }

                        Thread.Sleep(10);
                    }
                });

                for (int i = 0; i < 100; i++)
                {
                    byte[] datas = Encoding.UTF8.GetBytes(Name);
                    int Len = datas.Length;
                    netStream.Write(datas, 0, Len);
                    Thread.Sleep(1000);
                }

                netStream.Close();
                netStream = null;
                tcpClient.Close();

                Console.WriteLine("Completed");
            });
        }       
    }
}
六级标题

到了这里,关于C#TCP传输协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络】传输层TCP协议

    目录 一、概述 2.1 运输层的作用引出 2.2 传输控制协议TCP 简介 2.3 TCP最主要的特点 2.4 TCP连接 二、TCP报文段的首部格式 三、TCP的运输连接管理 3.1 TCP的连接建立(三次握手) 3.2 为什么是三次握手? 3.3 为何两次握手不可以呢? 3.4 TCP的连接释放(四次挥手) 3.5 为什么客户端在TIME

    2024年01月23日
    浏览(27)
  • 【网络编程】传输层协议——TCP协议

    TCP报头当中各个字段的含义如下 源/目的端口号 :表示数据是从哪个进程来,到发送到对端主机上的哪个进程。 32位序号/32位确认序号 :分别代表TCP报文当中每个字节数据的编号以及对对方的确认,是TCP保证可靠性的重要字段。 4位TCP报头长度 :表示该TCP报头的长度,以4字

    2024年02月17日
    浏览(43)
  • 【计算机网络】传输层协议 -- TCP协议

    认识可靠性 现在的计算机大多都是基于冯诺依曼体系结构的 虽然这里的输入设备、输出设备、内存、CPU是在同一个机器上的,但是它们彼此间却是相互独立的。如果它们之间要进行通信,那就必须要用“线”连接起来,其中连接内存和外设之间的“线”叫做IO总线,连接CP

    2024年02月14日
    浏览(39)
  • TCP/IP协议:最流行的电子邮件协议SMTP(简单邮件传输协议)详解

    SMTP 是一种电子邮件协议,用于通过互联网从一个电子邮件帐户向另一个电子邮件帐户发送电子邮件。它是TCP/IP协议应用层的一部分。作为一种电子邮件协议,它建立了不同电子邮件客户端和帐户之间轻松信息交换的规则。这样,简单邮件传输协议就可以实现广泛的电子邮件

    2024年02月20日
    浏览(31)
  • 【传输层】网络基础 -- UDP协议 | TCP协议

    端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中,用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 0 - 1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他

    2024年02月09日
    浏览(40)
  • 【计算机网络-传输层】TCP 协议

    端到端通信 :提供应用进程间的端到端通信(逻辑通信)。因此传输层又称为端到端协议。 差错检测 :对首部和数据部分进行检测。 两种协议 :面向连接的 TCP、无连接的 UDP。 复用和分用 : 概念 解释 传输层 TCP 复用 发送方的部分应用进程的报文在传输层使用 TCP 协议进

    2023年04月13日
    浏览(37)
  • UDP(用户数据报协议)和TCP(传输控制协议)是互联网协议(IP)中两种主要的传输层协议

    您的描述是正确的。UDP(用户数据报协议)和TCP(传输控制协议)是互联网协议(IP)中两种主要的传输层协议。他们之间有几个重要的区别,其中之一就是建立连接的方式。 连接方式: • TCP:在进行数据传输之前,需要通过三次握手(3-way handshake)建立连接。这可以确保

    2024年02月02日
    浏览(99)
  • 网络原理(四):传输层协议 TCP/UDP

    目录 应用层 传输层 udp 协议  端口号 报文长度(udp 长度) 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识,第二章和第三章我们通过代码感受了网络通信程序。 而本章的 通信原

    2023年04月27日
    浏览(42)
  • 【网络协议】聊聊TCP如何做到可靠传输的

    网络是不可靠的,所以在TCP协议中通过各种算法等机制保证数据传输的可靠性。生活中如何保证消息可靠传输的,那么就是采用一发一收的方式,但是这样其实效率并不高,所以通常采用的是累计确认或者累计应答。 TCP为了保证顺序性,每个包都有一个ID,这个是建立连接之

    2024年02月08日
    浏览(28)
  • 【计算机网络】传输层协议——TCP(上)

    TCP报文 等于报头 加 有效载荷 TCP的标准报头长度 整体为20字节 报头的宽度是0-31,表示报头所对应的字节数 (4字节)报文对应的宽度 为0-31 有效的标准报头长度一共 5行,所以 整体为20字节 选项 如:客户端和服务器建立好了链接,但这个链接长时间不关,并且也不发数据,所

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包