热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

c#实现简单控制台udp异步通信程序示例

这篇文章主要介绍了c#实现简单控制台udp异步通信程序示例,需要的朋友可以参考下

实现客户端发送请求,服务器端响应机制

UDP客户端代码

代码如下:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        //客户端 Socket对象
        private static Socket clientSocket;
        //服务器端 终点
        private static EndPoint epServer;
        //接收数据的字符数组
        private static byte[] receiveData;

        public static void Main(string[] args)
        {
            //客户端Socket对象实例化
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //设置服务器端IP地址和对应端口
            IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 11000);
            //实例化服务器端 终点
            epServer = (EndPoint)server;
            string msg;     //要发送的消息
            byte[] sendData;    //要发送的字符串
            while (true) {
                msg = Console.ReadLine();   //输入要发送的消息
                if (msg == "exit") break;   //当输入“exit”时,退出客户端程序
                //将消息通过ASCII编码转换为字符数组,
                //如果要发送汉字或其他特殊符号,可以采用UTF-8
                sendData = Encoding.ASCII.GetBytes(msg);   
                //开始异步发送消息
                //参数:sendData           要发送的数据
                //参数:0:                 要发送数据的起始位置
                //参数:sendData.Length:   要发送数据的字节数
                //参数:SocketFlags.None:  按位组合方式
                //参数:epServer:          接收方设备(包含IP和端口)
                //参数:new AsyncCallback(SendData):   委托
                //参数:null:          请求的状态信息
                clientSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
                    epServer, new AsyncCallback(SendData), null);
                //实例化接收数据的字符数组
                //若在声明时已经初始化,此处依然要进行重新初始化
                //当上次接收的数据长度大于本次,则该数组里包含上次接收的残留数据
                //比如:上次接收“你个小逗逼”。本次接收“开玩笑”。
                //则数组中的数据为:“开玩笑逗逼”。
                receiveData = new byte[1024];
                //开始异步接收消息
                //参数部分与异步发送部分对应,基本一致
                clientSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
                    ref epServer, new AsyncCallback(ReceiveData), null);
            }
        }

        //异步发送消息的委托函数
        private static void SendData(IAsyncResult iar)
        {
            //完成异步发送
            clientSocket.EndSend(iar);
        }

        //异步接收消息的委托函数
        private static void ReceiveData(IAsyncResult iar)
        {
            //完成异步接收  recv 表示接收到的字节数
            int recv = clientSocket.EndReceive(iar);
            //将接收到的数据打印出来
            Console.WriteLine("Server: " + Encoding.ASCII.GetString(receiveData, 0, recv));
        }

    }
}

UDP服务器端代码

代码如下:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class AsyncUdpServer
    {
        //服务器端Socket对象
        private static Socket serverSocket;
        //接收数据的字符数组
        private static byte[] receiveData = new byte[1024];

        public static void Main(string[] args)
        {
            //实例化服务器端Socket对象
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //服务器端的IP和端口,IPAddress.Any实际是:0.0.0.0,表示任意,基本上表示本机IP
            IPEndPoint server = new IPEndPoint(IPAddress.Any, 11000);
            //Socket对象跟服务器端的IP和端口绑定
            serverSocket.Bind(server);
            //客户端的IP和端口,端口 0 表示任意端口
            IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
            //实例化客户端 终点
            EndPoint epSender = (EndPoint)clients;
            //开始异步接收消息  接收后,epSender存储的是发送方的IP和端口
            serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
                ref epSender, new AsyncCallback(ReceiveData), epSender);
            Console.WriteLine("Listening...");
            Console.ReadLine();
        }

        private static void SendData(IAsyncResult iar)
        {
            serverSocket.EndSend(iar);
        }

        private static void ReceiveData(IAsyncResult iar)
        {
            //客户端的IP和端口,端口 0 表示任意端口
            IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
            //实例化客户端 终点
            EndPoint epSender = (EndPoint)client;
            //结束异步接收消息  recv 表示接收到的字符数
            int recv = serverSocket.EndReceiveFrom(iar, ref epSender);           
            //将接收到的数据打印出来,发送方采用什么编码方式,此处就采用什么编码方式 转换成字符串
            Console.WriteLine("Client:" + Encoding.ASCII.GetString(receiveData, 0, recv));
            //定义要发送回客户端的消息,采用ASCII编码,
            //如果要发送汉字或其他特殊符号,可以采用UTF-8           
            byte[] sendData = Encoding.ASCII.GetBytes("hello");
            //开始异步发送消息  epSender是上次接收消息时的客户端IP和端口信息
            serverSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
                epSender, new AsyncCallback(SendData), epSender);
            //重新实例化接收数据字节数组
            receiveData = new byte[1024];
            //开始异步接收消息,此处的委托函数是这个函数本身,递归
            serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
                ref epSender, new AsyncCallback(ReceiveData), epSender);
        }

    }
}


推荐阅读
  • 使用C# .NET构建UDP点对点聊天应用
    本文详细介绍如何利用C# .NET框架开发一个基于UDP协议的点对点聊天程序,包括客户端与服务器之间的连接建立、数据传输等核心功能。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 阿里宝卡用户能否在UC浏览器极速版中享受免流量服务?
    本文详细介绍了UC浏览器极速版是否支持阿里宝卡的免流量功能,以及如何正确设置以确保免流量服务的正常使用。 ... [详细]
  • NTP服务器配置详解:原理与工作模式
    本文深入探讨了网络时间协议(NTP)的工作原理及其多种工作模式,旨在帮助读者全面理解NTP的配置参数和应用场景。NTP是基于RFC 1305的时间同步标准,广泛应用于分布式系统中,确保设备间时钟的一致性。 ... [详细]
  • 苹果系统频繁弹窗提示无法验证服务器身份?竟是网易邮箱证书过期所致
    近日,众多苹果用户发现iOS、iPadOS和macOS系统频繁弹出无法验证服务器身份的警告。问题根源在于网易邮箱未能及时更新其数字证书,导致原证书过期后无法被信任。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
  • 本文深入探讨了MAC地址与IP地址绑定策略在网络安全中的应用及其潜在风险,同时提供了针对该策略的破解方法和相应的防御措施。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 三菱PLC SLMP协议报文详解
    本文详细解析了三菱PLC中使用的SLMP协议报文结构,包括其工作原理、通信流程及报文格式,旨在帮助工程师和技术人员更好地理解和运用这一协议。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • TCP/IP基础知识详解
    本文详细介绍了TCP/IP协议的基本概念,包括网络层次模型、TCP三次握手过程、四次挥手过程以及TCP与UDP的比较。通过这些内容,读者可以更好地理解TCP/IP协议的工作原理。 ... [详细]
  • 解析EasyCVR平台国标GB28181协议下的TCP与UDP模式
    在使用EasyCVR视频融合平台过程中,用户常遇到关于端口设置的问题,尤其是TCP和UDP模式的区别。本文将详细介绍这两种模式在GB28181协议下的具体应用及差异。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
author-avatar
欢乐文艺女青年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有