前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#UDP编程

C#UDP编程

作者头像
全栈程序员站长
发布于 2022-10-04 12:25:28
发布于 2022-10-04 12:25:28
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

一.UDP协议

UDP(User Datagram Protocol)协议就是“用户数据报协议”,它是一种无连接的协议,无连接主要是和TCP协议相比较的。我们知道当利用TCP协议传送数据的时候,首先必须建立连接(也就是所谓的握手)才可以传输数据。而当计算机利用UDP协议进行数据传输的时候,发送方只需要知道对方的IP地址和端口号就可以发送数据,而并不需要进行连接。

由于UDP协议并不需要进行确定的连接,所以编写基于UDP协议的应用程序比起编写基于TCP协议的应用程序要简单些(程序中可以不需要考虑连接和一些异常的捕获工作)。但同时也给基于UDP协议编写的程序带来了一个致命的缺点,UDP由于不提供可靠数据的传输,当计算机之间利用UDP协议传送数据的时候,发送方只管发送数据,而并不确认数据是否被对方接收。这样就会导致某些UDP协议数据包在传送的过程中丢失,尤其网络质量不令人满意的情况下,丢失数据包的现象会更严重。这就是为什么在网络上传输重要数据不采用UDP协议的原因。

可见UDP是一种不面向连接的网络协议,既有其优点,也有其不足,具体如下:

1.基于UDP协议的网络应用程序,实现起来比较简单,并且基于UDP协议的网络应用程序在运行时,由于受到环境影响较小,所以不容易出错。

2.UDP协议占用网络资源较少,数据处理较快,所以在网络中传送对安全性要求不是十分高数据时,其优点比较明显。所谓对安全性要求不高的数据,是指那些不重要的数据,或者是即使丢失若干数据,也不影响其整体的数据,如音频数据等。目前很多流行的网络应用程序都是基于UDP协议的,如OICQ、ICQ等。

3.由于其不是面向连接的网络协议,其缺点也是非常明显的,有些时候甚至是致命的。因为使用UDP协议来传送数据,在数据发送后,在发送方并不确认对方是否接收到。这样就可能导致传送的数据在网络中丢失,尤其在网络条件并不很好的情况下,丢失数据包的现象就更多。所以传送重要数据一般不采用UDP协议。

二.C#发送、接收UDP数据包使用的主要类及其用法

用Visual C#实现UDP协议,最为常用,也是最为关键的类就是UdpClient,UdpClient位于命名空间System.Net.Sockets中,Visual C#发送、接收UDP数据包都是通过UdpClient类的。

表-1 UdpClient类中常用方法及其说明

方法

说明

Close

关闭 UDP 连接

Connect

建立与远程主机的连接

DropMulticastGroup

退出多路广播组

JoinMulticastGroup

将 UdpClient 添加到多路广播组

Receive

返回已由远程主机发送的 UDP 数据文报

Send

将 UDP 数据文报发送到远程主机

表-2:UdpClient类中常用属性及其说明

属性

说明

Active

获取或设置一个值,该值指示是否已建立了与远程主机的连接

Client

获取或设置基础网络套接字

1. C#使用UdpClient类发送UDP数据包

在具体使用中,一般分成二种情况:

(1) 知道远程计算机IP地址:

Send方法的调用语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicint Send ( byte[] dgram , int bytes , IPEndPoint endPoint ) ;

参数说明:

dgram 要发送的 UDP数据文报(以字节数组表示)。

bytes 数据文报中的字节数。

endPoint一个 IPEndPoint类型,它表示要将数据文报发送到的主机IP和端口。

返回值 已发送的字节数。

下面使用UdpClient发送UDP数据包的具体的调用例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IPAddressHostIP = new IPAddress.Parse ( "192.168.0.188" ) ;
IPEndPointhost = new IPEndPoint ( HostIP , 10002 ) ;
UdpClient.Send( "发送的字节" , "发送的字节长度" , host ) ;

(2) 知道远程计算机名称

Send方法的调用语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicint Send ( byte[ ] dgram , int bytes , string hostname , int port ) ;

参数说明:

dgram 要发送的 UDP数据文报(以字节数组表示)。

bytes 数据文报中的字节数。

hostname要连接到的远程主机的名称。

port 要与其通讯的远程端口号。

返回值 已发送的字节数。

2. C#使用UdpClient类接收UDP数据包:

接收UDP数据包使用的是UdpClient中的Receive方法,此方法的调用语法如下:

publicbyte [] Receive ( ref IPEndPoint remoteEP ) ;

参数

remoteEP是一个 IPEndPoint类的实例,它表示网络中发送此数据包的节点。

下面使用UdpClient接收UDP数据包的具体的调用例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server= new UdpClient ( ) ;
receivePoint= new IPEndPoint (new IPAddress(127001), 8080 ) ;
byte[]recData = server.Receive ( ref receivePoint ) ;

三.UDP客户端代码,客户端程序主要就是向服务器端发送数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDPClient
{
    class UDPClient {
        private UdpClient client;
        private IPEndPoint receivePoint;
        //发送数据函数
        public void start_client() {
            Console.WriteLine("客户端启动");
            client = new UdpClient(8080);//客户端使用8080端口发送数据
            receivePoint = new IPEndPoint(new IPAddress(127001), 10002);
            IPAddress HostIP;
            bool continueLoop = true;
            while(continueLoop){
                System.Text.ASCIIEncoding encode = new System.Text.ASCIIEncoding();
                string sendString = Console.ReadLine();
                byte[] sendData = encode.GetBytes(sendString);
                try {
                    HostIP = IPAddress.Parse("127.0.0.1");
                    IPEndPoint host = new IPEndPoint(HostIP, 10002); //服务器端套接字,客户端发送数据到此套接字
                    client.Send(sendData, sendData.Length, host);
                    byte[] recData = client.Receive(ref receivePoint);//客户端使用8080端口,接收服务器从10002端口发送过来的数据
                    Console.WriteLine(encode.GetString(recData));
                    continueLoop = false;
                }catch{

                    client.Close();
                    return;
                }
                
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            UDPClient udpClient = new UDPClient();
            udpClient.start_client();
        }
    }
}

四.UDP服务器端代码,服务器端程序主要就是接收客户端发送的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace UdpServer
{
    class UdpServer {
        private UdpClient server;
        private IPEndPoint receivePoint;
       
        private Thread startServer;
        //接受数据函数start_server
        public void start_server() {
            Console.WriteLine("UDPServer启动。。。");
            while (true) {
                ASCIIEncoding encode = new ASCIIEncoding();
                byte[] recData = server.Receive(ref receivePoint);//服务器端从10002端口接收receivePoint发送来的数据包
                string Read_str = encode.GetString(recData);
                Console.WriteLine(Read_str);
                byte[] sendData = encode.GetBytes("OK");
                server.Send(sendData, sendData.Length, receivePoint);//服务器将数据发送到客户端的8080端口
            }
        }
        //创建一个线程
        public void run() {
         
            //利用本地端口号初始化一个UDP网络服务
            server = new UdpClient(10002);//本地端口号,客户端将数据发送到服务器的10002端口,服务器从10002端口接收数据
            receivePoint = new IPEndPoint(new IPAddress(127001),8080); //客户端的套接字
            startServer = new Thread(new ThreadStart(start_server));
            //启动线程
            startServer.Start();
        }
    }
    
    
    class Program
    {
        static void Main(string[] args)
        {
            UdpServer udpServer = new UdpServer();
            udpServer.run();
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196064.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月8日 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Unity】网络通信(TCP&UDP)
TCP和UDP是传输层协议,使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。
DevFrank
2024/07/24
3230
【Unity】网络通信(TCP&UDP)
初学者第69节网络编程-UDP
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。
用户5224393
2019/08/20
4770
C# Socket编程笔记
看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句。(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是,为了自己下一篇要写的文章做参考,还是有必要先补充一下socket基础知识。
zls365
2020/08/19
1.2K0
C# Socket编程笔记
C#教程之C#中使用UDP通信实例
网络通信协议中的UDP通信是无连接通信,客户端在发送数据前无需与服务器端建立连接,即使服务器端不在线也可以发送,但是不能保证服务器端可以收到数据。本文实例即为基于C#实现的UDP通信。具体功能代码如下:
zls365
2020/08/19
5.5K0
C#教程之C#中使用UDP通信实例
浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践。 Socket是一种网络编程接口,它是对传输层
蘑菇先生
2018/05/21
6660
[C#]UDP实现广播
原文链接:http://blog.csdn.net/humanking7/article/details/51125620
祥知道
2020/03/10
2.9K0
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
1. UDP 单播传输流程 : A 给 B 发送数据包 , B 设备一定要处于监听 X 端口状态 , A 向 B 的 X 端口发送数据包 , B 才能收到 ; B 收到 A 的数据包后 , B 就知道了 A 的端口号 Z 的信息了 , 此时 B 可以向 A 的 Z 端口号发送数据包 ;
韩曙亮
2023/03/27
1.7K0
【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
C#的Sockets
在现代软件开发中,网络通信是不可或缺的一部分。C#提供了一套强大的Sockets API,允许开发者进行底层的网络通信编程。本文将深入探讨Sockets的工作原理、使用场景、最佳实践以及一些高级技巧。
Michel_Rolle
2024/10/09
3K0
C# Socket编程 笔记,Socket 详解,入门简单
文章按照 Socket 的 创建、连接、传输数据、释放资源的过程来写。给出方法、参数的详细信息。
痴者工良
2021/04/26
1.4K0
Android | UDP的C/S通信实战案例(简易聊天室)
创建UDP服务端 new一个Module: 模块名为:sample 创建一个package,名为udp: InetAddress.InetAddressHolder源码: I
凌川江雪
2019/11/04
9970
[C#]UDP通讯
原文链接:http://blog.csdn.net/humanking7/article/details/51024884
祥知道
2020/03/10
1.3K0
基于UDP的网络数据传输测试(Java+Android)
零、前言 1.本文不是大讲特讲UDP和TCP的区别,或者其流程,只是基于此作些小测试 2.完成两个计算机、手机、计算机与手机之间的信息数据传输 3.把控制台输出及GUI操作 以及Android展
张风捷特烈
2018/10/08
1.6K0
基于UDP的网络数据传输测试(Java+Android)
电脑客户端遥控鸿蒙开发板执行相应命令
我们平时开发物联网相关的项目时,无线控制是我们必须具备的一个功能。我们可以通过编写的电脑客户端,实时控制我们开发板进行相应的操作。比如控制智能家居的灯光、风扇和加湿器等一系列操作。
跋扈洋
2022/03/29
6950
电脑客户端遥控鸿蒙开发板执行相应命令
C#编写上位机使用UDP给单片机发送Json格式数据
很多时候,我们想要通过上位机给我们的单片机下发命令,是我们能够控制单片机进行一些操作。而通常我们有几种方式,分别是串口传输、蓝牙传输、UDP和TCP这类WIFI传输等。 在本文就用C#编写上位机使用UDP给单片机发送Json格式数据,进行数据的传输。
跋扈洋
2022/03/29
1.2K0
C#编写上位机使用UDP给单片机发送Json格式数据
【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
接着上面,小编提到这里的DatagramPacket是一个输出型参数,和前面实现文件IO的操作类似的,这里的就是一个UDP数据报,是接收和发送数据的基本单位;
用户11288949
2024/10/21
1220
【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
udp 视频传输_webrtc视频流传输
在UDP实时图像传输一文中,介绍了如何使用UDP来实现图像的实时传输,并使用C#进行了发送端和接收端的搭建。但是文中的方法是对整张图片进行JPEG压缩,并通过UDP一次性地发送到接收端,由于一个UDP数据包只能发送64k字节的数据,所以该方法的图片传输大小是有限制的,实测只能发送480P视频中的图像。
全栈程序员站长
2022/11/09
1.9K0
udp 视频传输_webrtc视频流传输
C# UDP操作实例
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Ne
zls365
2020/08/19
1.2K0
C# UDP操作实例
【Java 基础篇】Java UDP通信详解
UDP(User Datagram Protocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。
繁依Fanyi
2023/10/12
6760
【Java 基础篇】Java UDP通信详解
Unity3D网络通讯(五)--Socket通讯之Udp通讯
上一篇《Unity3D网络通讯(四)--Socket通讯之Tcp通讯》我们把Tcp的通讯已经说完了,这篇主要说说Udp的通讯,相对于Tcp通讯,个人觉得Udp通讯要简单的很多,UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
Vaccae
2020/09/27
4.1K0
Unity3D网络通讯(五)--Socket通讯之Udp通讯
BS1051-基于C#+udp协议实现局域网内即时通信程序
基于udp的局域网内即时通信程序,系统利用UDP协议编写相应的程序实现局域网内部的即时通讯功能,其主要工作机制模仿互联网即时通讯产品的功能,采用UDP协议分别为客户端及服务端完成基础数据配置实现网络消息的相互传递。
计算机程序优异哥
2022/12/05
5090
相关推荐
【Unity】网络通信(TCP&UDP)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验