C#TCP传输协议

1. 什么是TCP

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

2.Socket

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

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

在这里插入图片描述
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
在这里插入图片描述
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.关闭服务端

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");
            });
        }       
    }
}
六级标题
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用C#传输文件,您可以使用TCP协议。以下是基本的C#代码示例,用于将文件从客户端发送到服务器。 客户端代码: ```csharp using System; using System.IO; using System.Net.Sockets; class Program { static void Main(string[] args) { // 创建TCP客户端 TcpClient client = new TcpClient("127.0.0.1", 9999); // 打开文件 FileStream fileStream = File.OpenRead(@"C:\test.txt"); // 创建网络流 NetworkStream networkStream = client.GetStream(); // 读取文件并发送给服务器 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { networkStream.Write(buffer, 0, bytesRead); } // 关闭网络流和文件流 networkStream.Close(); fileStream.Close(); // 关闭TCP客户端 client.Close(); } } ``` 服务器端代码: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { // 创建TCP服务器 TcpListener listener = new TcpListener(IPAddress.Any, 9999); listener.Start(); // 等待客户端连接 TcpClient client = listener.AcceptTcpClient(); // 创建网络流 NetworkStream networkStream = client.GetStream(); // 创建文件流 FileStream fileStream = File.Create(@"C:\test_server.txt"); // 接收客户端发送的文件并写入本地文件 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0) { fileStream.Write(buffer, 0, bytesRead); } // 关闭网络流和文件流 networkStream.Close(); fileStream.Close(); // 关闭TCP服务器 listener.Stop(); } } ``` 请注意,此示例只用于演示如何传输文件。在实际应用程序中,您可能需要添加更多的错误处理和安全检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值