返回顶部
首页 > 资讯 > 精选 >在C# 中使用Socke实现一个UDP
  • 928
分享到

在C# 中使用Socke实现一个UDP

2023-06-06 10:06:52 928人浏览 独家记忆
摘要

这篇文章给大家介绍在C# 中使用Socke实现一个UDP,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述UDP和tcp是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.ne

这篇文章给大家介绍在C# 中使用Socke实现一个UDP,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

一、概述

UDP和tcp网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.net框架通过UdpClient、TcpListener 、TcpClient这几个类对Socket进行了封装,使其使用更加方便, 本文就通过这几个封装过的类讲解一下相关应用。

二、UDP基本应用

与TCP通信不同,UDP通信是不分服务端和客户端的,通信双方是对等的。为了描述方便,我们把通信双方称为发送方和接收方。

发送方:

首先创建一个UDP对象:

string locateIP = "127.0.0.1"; //本机IP   int locatePort = 9001;   //发送端口   IPAddress locateIpAddr = IPAddress.Parse(locateIP);   IPEndPoint locatePoint = new IPEndPoint(locateIpAddr, locatePort);   UdpClient udpClient = new UdpClient(locatePoint);

发送数据:

string remoteIP = "127.0.0.1";    //目标机器IP   int remotePort = 9002;      //接收端口      IPAddress remoteIpAddr = IPAddress.Parse(remoteIP);   IPEndPoint remotePoint = new IPEndPoint(remoteIpAddr, remotePort);   byte[] buffer = Encoding.UTF8.GetBytes(“hello”);   udpClient.Send(buffer, buffer.Length, remotePoint);

以上就完成了一个发送任务,一个较完整的发送代码如下: 

public partial class FORMServer : Form {  private UdpClient udpClient = null;  private void btnConnect_Click(object sender, EventArgs e)  {   string locateIP = "127.0.0.1";   int locatePort = 9001;   IPAddress locateIpAddr = IPAddress.Parse(locateIP);   IPEndPoint locatePoint = new IPEndPoint(locateIpAddr, locatePort);   udpClient = new UdpClient(locatePoint);   this.groupWork.Enabled = true;  }  private void Send_Click(object sender, EventArgs e)  {   string text = this.txtSend.Text.Trim();   string remoteIP = "127.0.0.1";   int remotePort = 9002;   byte[] buffer = Encoding.UTF8.GetBytes(text);   if (udpClient != null)   {    IPAddress remoteIp = IPAddress.Parse(remoteIP);    IPEndPoint remotePoint = new IPEndPoint(remoteIp, remotePort);    udpClient.Send(buffer, buffer.Length, remotePoint);   }   Debug.WriteLine("Send OK");  } }

接收端: 

首先创建一个UDP对象:

string locateIP = "127.0.0.1";   int locatePort = 9002;   IPAddress locateIpAddr = IPAddress.Parse(locateIP);   IPEndPoint locatePoint = new IPEndPoint(locateIpAddr, locatePort);   UdpClient udpClient = new UdpClient(locatePoint);

接收数据: 

IPEndPoint remotePoint = new IPEndPoint(IPAddress.Parse("1.1.1.1"), 1);  var received = udpClient.Receive(ref remotePoint);  string info = Encoding.UTF8.GetString(received);  string from=$” {remotePoint.Address}:{remotePoint.Port}”;

注意两点:

remotePoint是获得发送方的IP信息,定义时可以输入任何合法的IP和端口信息;

Receive方法是阻塞方法,所以需要在新的线程内运行,程序会一直等待接收数据,当接收到一包数据时程序就返回,要持续接收数据需要重复调用Receive方法。

一个较完整的接收端代码如下: 

public partial class FormClent : Form {  private UdpClient udpClient = null;   private void btnConnect_Click(object sender, EventArgs e)  {   string locateIP = "127.0.0.1";   int locatePort = 9002;   IPAddress locateIpAddr = IPAddress.Parse(locateIP);   IPEndPoint locatePoint = new IPEndPoint(locateIpAddr, locatePort);   udpClient = new UdpClient(locatePoint);   IPEndPoint remotePoint = new IPEndPoint(IPAddress.Parse("1.1.1.1"), 1);   Task.Run(() =>   {    while (true)    {     if (udpClient != null)     {      var received = udpClient.Receive(ref remotePoint);      string info = Encoding.UTF8.GetString(received);      string from=$” {remotePoint.Address}:{remotePoint.Port}”;      }    }   });   } }

三、丢包和乱序问题

   当发送端发送一包数据时,不管对方是否接收都是发送成功的,UDP协议本身并不会对发送的可靠性进行验证。(这里的可靠性是指是否接收到,如果对方接收到数据包,其内容还是可靠的,这个在链路层进行了保证。)同时,由于网络延时等因素,先发送的包并不能确定先被接收到,所以由于这两个原因,UDP通信存在丢包和乱序的情况。

   某些业务场景下,比如实时状态监控,可能对丢包和乱序情况并不敏感, 可以不用处理,但大部分情况下还是介意丢包的,简单的处理办法就是把包的头部固定长度的空间拿出来存放核对信息,比如包编号,如果有缺失,可以要求发送方重发,也可以进行排序

四、将数据接收包装为事件

 我们对UdpClent又进行一次封装,启用一个线程进行接收数据,将接收到的数据包通过事件发布出来,这样使用起来就更方便了。

namespace Communication.UDPClient{ public class UdpStateEventArgs : EventArgs {    public IPEndPoint remoteEndPoint;    public byte[] buffer = null; } public delegate void UDPReceivedEventHandler(UdpStateEventArgs args); public class UDPClient {  private UdpClient udpClient;  public event UDPReceivedEventHandler UDPMessageReceived;  public UDPClient(string locateIP, int locatePort)  {   IPAddress locateIp = IPAddress.Parse(locateIP);   IPEndPoint locatePoint = new IPEndPoint(locateIp, locatePort);   udpClient = new UdpClient(locatePoint);   //监听创建好后,创建一个线程,开始接收信息   Task.Run(() =>   {    while (true)    {     UdpStateEventArgs udpReceiveState = new UdpStateEventArgs();     if (udpClient != null)     {      IPEndPoint remotePoint = new IPEndPoint(IPAddress.Parse("1.1.1.1"), 1);      var received = udpClient.Receive(ref remotePoint);      udpReceiveState.remoteEndPoint = remotePoint;      udpReceiveState.buffer = received;      UDPMessageReceived?.Invoke(udpReceiveState);     }     else     {      break;     }    }   });  } }}

具体使用办法:

private void btnConnect_Click(object sender, EventArgs e)  {   string locateIP = "127.0.0.1";   int locatePort = 9002;      UDPClient udpClient = new UDPClient(locateIP, locatePort);   udpClient.UDPMessageReceived += UdpClient_UDPMessageReceived;     }  private void UdpClient_UDPMessageReceived(UdpStateEventArgs args)  {   var remotePoint = args.remoteEndPoint;   string info = Encoding.UTF8.GetString(args.buffer);   }

关于在C# 中使用Socke实现一个UDP就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 在C# 中使用Socke实现一个UDP

本文链接: https://lsjlt.com/news/246388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在C# 中使用Socke实现一个UDP
    这篇文章给大家介绍在C# 中使用Socke实现一个UDP,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NE...
    99+
    2023-06-06
  • 如何使用C语言实现本地socke通讯
    这篇文章主要介绍了如何使用C语言实现本地socke通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述  使用本地socket通讯可以实现进程之间的通讯。  相关函数描...
    99+
    2023-06-22
  • 在c#中使用Socket实现一个tcp协议
    这篇文章给大家介绍在c#中使用Socket实现一个tcp协议,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于....
    99+
    2023-06-06
  • 使用C语言实现本地socke通讯的方法
    一、概述   使用本地socket通讯可以实现进程之间的通讯。   相关函数描述如下: int socket(int domain, int type, int protocol...
    99+
    2024-04-02
  • 怎么在JAVA项目中实现一个UDP网络通讯功能
    今天就跟大家聊聊有关怎么在JAVA项目中实现一个UDP网络通讯功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体如下:UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用...
    99+
    2023-05-31
    java udp ava
  • 怎么在C#中使用MJPEG实现一个客户端功能
    怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务...
    99+
    2023-06-06
  • 如何在C#中实现一个TextBox事件
    本篇文章为大家展示了如何在C#中实现一个TextBox事件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# TextBox事件的效果预期一般情况下:◆当一个页面有TextBox以及Button的时...
    99+
    2023-06-17
  • 使用C#实现一个PPT遥控器
    目录说明截图具体实现1、在 Win Form项目中内嵌HTTP服务器操作PPT获取注释完善服务器完成前端说明 本项目参考了 https://github.com/yangzhongk...
    99+
    2024-04-02
  • 怎么在C++中使用opencv实现一个车道线识别功能
    本篇文章为大家展示了怎么在C++中使用opencv实现一个车道线识别功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(一)目前国内外广泛使用的车道线检测方法主要分为两大类:(1) 基于道路特征的车...
    99+
    2023-06-06
  • 怎么在python中使用feapde实现一个爬虫
    这篇文章给大家介绍怎么在python中使用feapde实现一个爬虫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的...
    99+
    2023-06-14
  • 在Java中使用Jsoup实现一个爬虫功能
    在Java中使用Jsoup实现一个爬虫功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 Java 爬虫工具Jsoup详解Jsoup是一款 Java 的 HTML 解...
    99+
    2023-05-31
    java 爬虫 jsoup
  • 在Java中使用swing实现一个录音功能
    在Java中使用swing实现一个录音功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。添加监听事件:import java.awt.*;import java.awt.eve...
    99+
    2023-05-31
    java swing ava
  • C++中怎么实现一个LeetCode
    这篇文章给大家介绍C++中怎么实现一个LeetCode,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[LeetCode] 128.Longest Consecutive Sequence 求最长连续序列Given an...
    99+
    2023-06-20
  • 如何在c#项目中实现一个winform主题
    如何在c#项目中实现一个winform主题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一个接口,需要做主题的控件、窗体都要实现这个接口/// <summa...
    99+
    2023-06-06
  • 如何在C++项目中实现一个aligned_malloc方法
    这篇文章将为大家详细讲解有关如何在C++项目中实现一个aligned_malloc方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。malloc的默认行为int main(){&n...
    99+
    2023-06-07
  • 使用python怎么创建一个UDP服务器
    这篇文章给大家介绍使用python怎么创建一个UDP服务器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本...
    99+
    2023-06-14
  • 怎么在ccs3中使用timeline实现一个时间线
    本篇文章为大家展示了怎么在ccs3中使用timeline实现一个时间线,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。test.html文件<!DOCTYPE html><...
    99+
    2023-06-08
  • 怎么在java中使用SocketChannel实现一个客户端
    怎么在java中使用SocketChannel实现一个客户端?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spr...
    99+
    2023-06-14
  • 怎么在Java中使用agent实现一个main方法
    怎么在Java中使用agent实现一个main方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。创建Agent项目PreMainExecutor 类,在main...
    99+
    2023-05-31
    java agent main
  • 在Android中使用TextView实现一个跑马灯效果
    本篇文章为大家展示了在Android中使用TextView实现一个跑马灯效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 条件:android:ellipsize=”marquee”Te...
    99+
    2023-05-31
    textview android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作