C# UDP操作实例
时间:2022-07-23
本文章向大家介绍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.Net;
using System.Net.NetworkInformation;
using System.Management;
using System.Threading;
namespace Udp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
///
/// 用于UDP发送的网络服务类
///
private UdpClient udpcSend;
///
/// 用于UDP接收的网络服务类
///
private UdpClient udpcRecv;
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(richTextBox1.Text))
{
MessageBox.Show("请先输入待发送内容");
return;
}
// 匿名发送
//udpcSend = new UdpClient(0); // 自动分配本地IPv4地址
// 实名发送
IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("192.168.1.3"), 8847); // 本机IP,指定的端口号
udpcSend = new UdpClient(localIpep);
Thread thrSend = new Thread(SendMessage);
thrSend.Start(richTextBox1.Text);
}
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] sendbytes = Encoding.Unicode.GetBytes(message);
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("192.168.1.3"), 8848); // 发送到的IP地址和端口号
udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep);
udpcSend.Close();
ResetTextBox(richTextBox1);
}
/// <summary>
/// 开关:在监听UDP报文阶段为true,否则为false
/// </summary>
bool IsUdpcRecvStart = false;
/// <summary>
/// 线程:不断监听UDP报文
/// </summary>
Thread thrRecv;
private void button2_Click(object sender, EventArgs e)
{
if (!IsUdpcRecvStart) // 未监听的情况,开始监听
{
IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("192.168.1.3"), 8848); // 本机IP和监听端口号
udpcRecv = new UdpClient(localIpep);
thrRecv = new Thread(ReceiveMessage);
thrRecv.Start();
IsUdpcRecvStart = true;
// MessageBox.Show("1123");
ShowMessage(richTextBox2, "UDP监听器已成功启动");
}
else // 正在监听的情况,终止监听
{
thrRecv.Abort(); // 必须先关闭这个线程,否则会异常
udpcRecv.Close();
IsUdpcRecvStart = false;
ShowMessage(richTextBox2, "UDP监听器已成功关闭");
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="obj"></param>
private void ReceiveMessage(object obj)
{
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0);//
while (true)
{
try
{
byte[] bytRecv = udpcRecv.Receive(ref remoteIpep);
string message = Encoding.Unicode.GetString(bytRecv, 0, bytRecv.Length);
ShowMessage(richTextBox2, string.Format("{0}[{1}]", remoteIpep, message));
}
catch (Exception ex)
{
ShowMessage(richTextBox2, ex.Message);
break;
}
}
}
// 向RichTextBox中添加文本
delegate void ShowMessageDelegate(RichTextBox txtbox, string message);
private void ShowMessage(RichTextBox txtbox, string message)
{
if (txtbox.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
txtbox.Invoke(showMessageDelegate, new object[] { txtbox, message });
}
else
{
txtbox.Text += message + "rn";
}
}
// 清空指定RichTextBox中的文本
delegate void ResetTextBoxDelegate(RichTextBox txtbox);
private void ResetTextBox(RichTextBox txtbox)
{
if (txtbox.InvokeRequired)
{
ResetTextBoxDelegate resetTextBoxDelegate = ResetTextBox;
txtbox.Invoke(resetTextBoxDelegate, new object[] { txtbox });
}
else
{
txtbox.Text = "";
}
}
/// <summary>
/// 关闭程序,强制退出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Environment.Exit(0);
}
}
}
- 从0到1:PostCSS 插件开发最佳实践
- VUE 入门基础(4)
- 实例演示Android异步加载图片
- 使用OData协议查询Windows日志
- Android之Notification介绍
- postcss-lazysprite: 一种生成CSS 雪碧图的懒惰姿势
- Activity间中使用Intent传值
- VUE 入门基础(3)
- ASP.NET MVC 2 转换工具
- 使用Sysinternals工具定时休眠Windows Server 2008 R2
- Android中BroadcastReceiver广播
- 启用Windows 7/2008 R2 XPS Viewer
- Spring历史版本变迁和如今的生态帝国
- Android中Services之异步IntentService
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android如何取得本地通讯录的头像的原图的实现代码
- 取消Android Studio项目与SVN关联的方法
- Android编程实现获取当前系统语言及地区并更改语言的方法
- Android Studio绑定下拉框数据详解
- python中的socket实现ftp客户端和服务器收发文件及md5加密文件
- Android XRecyclerView实现多条目加载
- python3安装OCR识别库tesserocr过程图解
- Android studio 3.0上进行多渠道打包遇到的问题小结(超简洁版)
- Python自动重新加载模块详解(autoreload module)
- python自动脚本的pyautogui入门学习
- Android手机号码输入框(满11位自动跳到下个输入框)实例代码
- Android实现简单实用的搜索框
- Android Studio实现带边框的圆形头像
- android studio 3.0 gradle 打包脚本配置详解
- Android自定义垂直拖动seekbar进度条