一、UDP协议概述
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,数据报文的大小在IP协议层被限制为65,507字节。UDP不保证数据的可靠传输,没有重传机制,而且无序且不重复,比TCP更加轻量级,通常用于实时的应用场景,如游戏,视频等。
二、c#udp实现
1、发送数据
c#中使用UdpClient实现UDP协议的发送数据,示例代码如下:
using System.Net.Sockets;
using System.Text;
class SendData
{
static void Main(string[] args)
{
//定义IP和端口
string ip = "127.0.0.1";
int port = 8888;
//定义发送的数据
string message = "Hello World!";
byte[] sendBytes = Encoding.ASCII.GetBytes(message);
//定义UDP客户端
UdpClient client = new UdpClient();
//发送数据
client.Send(sendBytes, sendBytes.Length, ip, port);
//关闭UDP客户端
client.Close();
}
}
2、接收数据
c#中使用UdpClient实现UDP协议的接收数据,示例代码如下:
using System.Net;
using System.Net.Sockets;
using System.Text;
class ReceiveData
{
static void Main(string[] args)
{
//定义IP和端口
string ip = "127.0.0.1";
int port = 8888;
//定义UDP客户端
UdpClient client = new UdpClient(port);
//定义接收数据的IP和端口
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse(ip), port);
while (true)
{
//接收数据
byte[] receiveBytes = client.Receive(ref remoteIpep);
string message = Encoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length);
Console.WriteLine("接收到的数据为:" + message);
}
//关闭UDP客户端
client.Close();
}
}
三、小标题
1、c#udp实现视频传输
UDP适用于实时的应用,如实时视频传输。c#可以结合FFmpeg库实现视频的采集和传输,示例代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FFmpeg.AutoGen;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Threading;
using System.Net;
namespace UdpVideoStreaming
{
class Program
{
static void Main(string[] args)
{
int videoStreamIndex = -1;
//初始化FFmpeg
ffmpeg.av_register_all();
ffmpeg.avcodec_register_all();
ffmpeg.avformat_network_init();
//打开视频
AVFormatContext* pFormatContext = null;
if (ffmpeg.avformat_open_input(&pFormatContext, "test.mp4", null, null) != 0)
{
Console.WriteLine("无法打开视频文件");
return;
}
//查找视频流
if (ffmpeg.avformat_find_stream_info(pFormatContext, null) < 0)
{
Console.WriteLine("无法查找视频流");
return;
}
Codecs.CodecContext videoCodecContext = new Codecs.CodecContext();
videoStreamIndex = ffmpeg.av_find_best_stream(pFormatContext, AVMediaType.AVMEDIA_TYPE_VIDEO, -1, -1,videoCodecContext.Codec, 0);
if (videoStreamIndex == -1)
{
Console.WriteLine("无法找到视频流");
return;
}
//打开视频解码器
if (ffmpeg.avcodec_open2(videoCodecContext, videoCodecContext.Codec, null) = 0)
{
if (pPacket->stream_index == videoStreamIndex)
{
//发送视频数据
int length = 0;
byte[] data = new byte[pPacket->size];
Marshal.Copy(new IntPtr(pPacket->data), data, 0, pPacket->size);
client.Send(data, data.Length, remoteIpep);
//延时
Thread.Sleep(40);
}
ffmpeg.av_packet_unref(pPacket);
}
ffmpeg.av_packet_free(&pPacket);
ffmpeg.avcodec_close(videoCodecContext);
ffmpeg.avformat_close_input(&pFormatContext);
}
}
}
2、c#udp实现多人游戏
UDP适用于实时的应用,如多人网络游戏。c#可以使用Unity引擎结合UDP协议实现多人游戏,示例代码如下:
using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using System.Threading;
public class UdpController : MonoBehaviour
{
private UdpClient udpClient;
private Thread receiveThread;
private void Start()
{
//定义接收数据的IP和端口
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 8888);
//定义UDP客户端
udpClient = new UdpClient(remoteIpep);
//开启接收数据的线程
receiveThread = new Thread(new ThreadStart(ReceiveData));
receiveThread.Start();
}
private void OnApplicationQuit()
{
receiveThread.Abort();
udpClient.Close();
}
private void ReceiveData()
{
while (true)
{
byte[] receiveBytes = udpClient.Receive(ref remoteIpep);
string message = Encoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length);
Debug.Log("接收到的数据为:" + message);
}
}
private void SendData()
{
//定义发送的数据
string message = "Hello World!";
byte[] sendBytes = Encoding.ASCII.GetBytes(message);
//定义发送的IP和端口
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
//发送数据
udpClient.Send(sendBytes, sendBytes.Length, remoteIpep);
}
}
3、c#udp与TCP的区别
TCP为面向连接的协议,具有可靠性高的特点,可以保证数据的可靠传输。而UDP为无连接的协议,不保证数据的可靠传输,但是更轻量级。在网络游戏,实时视频传输等实时应用场景中,使用UDP能够保证更好的实时性。
原创文章,作者:NAMYB,如若转载,请注明出处:https://www.506064.com/n/329188.html
微信扫一扫
支付宝扫一扫