[ C# ] C#中TCP服务端的实现

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

  一、写在前面

       本文所用例子为个人学习的小结,如有不足之处请各位多多海涵,欢迎小伙伴一起学习进步,如果想法可在评论区指出,我会尽快回复您,不胜感激!

        所公布代码或截图均为运行成功后展示。

        嘿嘿,小小免责声明一下!部分代码可能与其他网络例子相似,如原作者看到有不满,请联系我修改,感谢理解与支持!

二、本文内容

        首先引入上一章的地址,需要了解客户端代码的小伙伴可以移步:[ C# ] C#中客户端通过Tcp协议和服务端通讯-CSDN博客文章浏览阅读515次,点赞17次,收藏9次。C# 实现客户端TCP通讯的小例子https://blog.csdn.net/wxf5522/article/details/135407454        在上一章中我们介绍了C#中客户端如何通过TCP协议向服务器发起请求,这一章我们将学习Tcp服务端如何起线程监听客户端的请求并根据请求信息解析并回复结果。

Tips:

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它是互联网协议套件(TCP/IP)的核心协议之一。

TCP协议的主要特点和功能包括:

1. 面向连接:在数据传输之前,发送端和接收端需要建立连接。这个过程通常被称为三次握手。

2. 可靠传输:TCP提供了确认、重传和超时重发等机制,确保数据能够可靠地从发送端传输到接收端。

3. 流量控制:TCP使用滑动窗口机制进行流量控制,防止发送端发送数据的速度超过接收端接收数据的速度。

4. 拥塞控制:当网络出现拥塞时,TCP会减少数据的发送速度,避免网络拥塞的情况进一步恶化。

5. 有序数据传输:TCP会对数据进行编号,确保所有的数据都能按照发送的顺序被接收。

6. 全双工通信:TCP连接的两端都可以同时发送和接收数据。

TCP协议广泛应用于各种网络应用,如Web浏览(HTTP/HTTPS协议)、邮件传输(SMTP协议)、文件传输(FTP协议)等。

        

三、开发环境

        1.开发语言:C#

        2.开发框架:.Net Framework 4.8

        2.界面框架:Winform

        3.开发工具:Visual Studio 2022

四、代码实现

        4.1定义基础变量

        public Socket TCPServerSocket { get; set; }
        public Dictionary<string, Socket> Sockets { get; set; } = new Dictionary<string, Socket>();

       4.2定义创建服务端TCP服务

        /// <summary>
        /// 创建服务端Socket
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private Socket CreateSocket(string ip, string port)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(ip);
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(port));
            socket.Bind(endPoint);
            socket.Listen(20);
            return socket;
        }

      4.3定义监听客户端请求的线程并启动

        /// <summary>
        /// 创建监听客户端的线程并启动
        /// </summary>
        private void CreateThread()
        {
            Thread watchThread = new Thread(WatchConnection);
            watchThread.IsBackground = true;
            watchThread.Start();
        }
        /// <summary>
        /// 监听客户端请求
        /// </summary>
        private void WatchConnection()
        {
            while (true)
            {
                Socket clientSocket = null;
                try
                {
                    clientSocket = TCPServerSocket.Accept();
                    IPEndPoint endPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
                    string ip = endPoint.Address.ToString();
                    string port = endPoint.Port.ToString();
                    Sockets.Add(ip + ":" + port, clientSocket);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    break;
                }
                ParameterizedThreadStart pts = new ParameterizedThreadStart(ClientReceiver);
                Thread clientThread = new Thread(pts);
                clientThread.IsBackground = true;
                clientThread.Start(clientSocket);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="socket"></param>
        private void ClientReceiver(object socket)
        {
            Socket clientSocket = socket as Socket;
            int ReceiveBufferSize = 10240;
            while (true)
            {
                int receivedLength = 0;
                byte[] r_buffer = new byte[ReceiveBufferSize];
                byte[] buffer = new byte[ReceiveBufferSize];
                try
                {
                    List<byte> ls = new List<byte>();

                    if (clientSocket != null)
                    {
                        receivedLength = clientSocket.Receive(r_buffer);
                        buffer = new byte[receivedLength];
                        if (receivedLength > 0)
                        {
                            Console.WriteLine("receivedLength:" + receivedLength);
                            Buffer.BlockCopy(r_buffer, 0, buffer, 0, receivedLength);
                            string msg = "Receive Success " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            byte[] datas = System.Text.Encoding.UTF8.GetBytes(msg);
                            Console.WriteLine(BitConverter.ToString(buffer).Replace("-", " "));
                            byte[] responseBuffer = null;

                            byte messageType = buffer[1];

                            switch (messageType)
                            {
                                case 0:
                                    break;
                                case 1:
                                    if (buffer[7] == 1)
                                    {
                                        if (buffer[6] == 0)
                                            responseBuffer = new byte[] { 0x5A, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00 };
                                                     }
                                    //省略
                                    break;
                                //TODO 
                                default:
                                    break;
                            }

                            Console.WriteLine(BitConverter.ToString(responseBuffer).Replace("-", " "));
                            clientSocket.Send(responseBuffer);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    break;
                }
            }
        }

        4.4定义启动服务器的方法

        /// <summary>
        /// 启动服务器
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void TCPServerStart(string ip, string port)
        {
            TCPServerSocket = CreateSocket(ip, port);
            CreateThread();
        }

        4.5在main或需要启动的地方调用

TCPServerStart("127.0.0.1", "15800");

五、小结

       C# 的TCP服务端的代码就是这样,总结一下:

                1.启动TCP服务端并监听端口

                2.开启线程接收服务端监听到的客户端

                3.开启线程监听客户端发送的消息,处理并返回需要的结果

六、感谢

        感谢各位大佬的莅临,学习之路漫漫,吾将上下而求索。有任何想法请在评论区留言哦!

        再次感谢!

[ C# ] C#中TCP服务端的实现,小紧张的C#学习之路,c#,tcp/ip,网络,.net,网络协议

 文章来源地址https://www.toymoban.com/news/detail-799843.html

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

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

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

相关文章

  • QT TCP网络编程——服务端的实现

    温馨提示:初来乍到,请多关照,文章如有不足,还请不吝赐教。本程序是仿照通讯助手(NetAssist.exe)进行界面设计以及基本功能实现的,主要实现的功能有监听服务器端口、发送、接收数据。使用到的工具及编程语言为:visual studio 2015、QT、C++,其中代码仅供参考 提示:以

    2024年02月04日
    浏览(31)
  • QT学习笔记:TCP客户端的实现

    QT一般用来做客户端,我这里就简单讲一下怎么开发基于QT的TCP客户端。 1、用QtCreator创建项目   2、界面 3、.pro文件添加network  4、mainwindow.h 5、mainwindow.cpp 6、main.cpp 7、执行结果 (1)界面如下 (2)连接tcp服务端 参考: (1)Qt6教程之三(13) TCP/IP通讯与socket编程

    2024年02月12日
    浏览(23)
  • C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一)

    测试软件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 如下图所示,打开S7-PLCSIM ADVANCED V3.0仿真软件,新键一个实例,设置仿真PLC的IP地址等参数,然后点击Start激活PLC, 如下图所示,激活PLC后,可以看到已经存在一个实例, 如下图所示,打开TIA PORTAL V15.1,新建一个项目,

    2023年04月15日
    浏览(32)
  • TCP服务器的C#实现

    1、TCP实现类 2、页面布局 3、后台代码 4、运行结果

    2024年02月09日
    浏览(38)
  • TCP服务器和客户端的创建步骤

    一、创建套接字(socket函数): 通信域选择IPV4网络协议、套接字类型选择流式; 二、填充服务器的网络信息结构体: 1.定义网络信息结构体变量; 2.求出结构体变量的内存空间大小; 3.结构体清零; 4.使用IPV4网络协议; 5.预留给在终端输入的网络字节序的端口号; 6.预留给

    2024年01月17日
    浏览(32)
  • TCP的服务器和客户端的通信

    实现不同主机之间的进程间通信(服务器和客户端的通信),并且一个服务器可以处理很多个客户端的请求。 协议:通信双方所遵守的通信规则。 网络体系结构:指网络的层次结构和每层所使用的协议的集合。 网络采用分而治之的方法设计,将网络的功能划分为不同的模块

    2023年04月23日
    浏览(27)
  • 【JavaEE初阶】 TCP服务器与客户端的搭建

    TCP服务器与客户端的搭建需要借助以下API TCP之间通信通过流进行传输,无论是服务器还是客户端:读取内容用输入流,写入内容用输出流 ServerSocket 是创建TCP服务端Socket的API。 ServerSocket 构造方法 : 方法签名 方法说明 ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定

    2024年02月05日
    浏览(28)
  • Qt实践:TCP服务器和客户端的设计

    Qt:5.12.2 Qt Creator:4.11.1 通信方式:TCPIP 语言:C++ 客户端的界面UI包含服务器IP、服务器端口、以及一些简单的功能,数据可选ASCLL及HEX格式。当未与服务器建立连接时,该客户端的部分控件设置为禁用。 \\\'getIp()\\\'函数可以根据不同的操作系统获取本地 IP 地址。在 Windows 系统下

    2024年02月03日
    浏览(32)
  • TCP/IP C 语言实现单个客户端和服务端 TCP 通信

     这是多线程服务端 这是单线程服务端  这是客户端  

    2024年02月21日
    浏览(38)
  • QT学习TCP/IP通信(一个服务端对多个客户端)

    QT学习TCP/IP通信(一个服务端对多个客户端) 一、服务端: 1.创建QTcpServer对象 2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号) 3.定义一个QLis容器对象存储客户信息; 4.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的

    2024年02月11日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包