C#UDP(接收和发送源码)源码完整
C#UDP(接收和发送源码)源码完整
最近做了一个UDP的服务接收和发送的东西。希望能对初学的朋友一点帮助。
源码如下:
一。逻辑--UdpServer.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Xml.Linq;
using PitchServer.po;
namespace PitchServer.vo
{
class UdpServer
{
#region 构造方法
public UdpServer():this(50000,1024){}
public UdpServer(ushort port):this(port,1024)
{
_Port = port;
}
public UdpServer(ushort port,uint bufferSize)
{
_Port = port;
_bufferSize = bufferSize;
}
#endregion
#region 属性
ushort _Port = 50000;
public ushort Port
{
get { return _Port; }
}
uint _bufferSize = 1024;
public uint BufferSize
{
get{return _bufferSize;}
}
bool m_IsRunning;
public bool IsRunning
{
get{return m_IsRunning;}
}
public static Socket m_UdpServer
{
get;
set;
}
string Ip_Address = "";
#endregion
Thread m_DataReceiveProcThread;
public static List<Client> IpAddress = new List<Client>();
#region 事件定义
public delegate void OnReceivedDataHandler(object sender,DataReceivedEventArgs e);
public event OnReceivedDataHandler OnRecivedData;
public delegate void OnStateChangedHandler(object sender,ServerStateChangeEventArgs e);
public event OnStateChangedHandler OnStateChanged;
#endregion
void DataReceiveProc()
{
while(m_IsRunning)
{
try
{
byte[] data = new byte[BufferSize];
m_UdpServer.Receive(data);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, (int)Port);
EndPoint senderRemote = (EndPoint)ep;
m_UdpServer.ReceiveFrom(data, ref senderRemote);
ep = (IPEndPoint)senderRemote;
Ip_Address=ep.Address.ToString();
bool isexit = false;
for (int i = 0; i < IpAddress.Count; i++)
{
if (Ip_Address == IpAddress[i].IPaddress)
{
isexit = true;
}
}
if (!isexit)
{
Client cl = new Client();
cl.IPaddress = Ip_Address;
cl.Port = ep.Port.ToString();
IpAddress.Add(cl);
}
if(OnRecivedData != null)
OnRecivedData(this, new DataReceivedEventArgs(data, Ip_Address));
System.Threading.Thread.Sleep(100);
}
catch(Exception ex)
{
m_IsRunning = false;
if(OnStateChanged != null)
OnStateChanged(this,new ServerStateChangeEventArgs(false));
throw ex;
}
}
}
public void Stop()
{
if(m_IsRunning)
{
try
{
m_IsRunning = false;
if(OnStateChanged != null)
OnStateChanged(this,new ServerStateChangeEventArgs(m_IsRunning));
m_UdpServer.Shutdown(SocketShutdown.Both);
m_UdpServer.Close();
m_DataReceiveProcThread.Abort();
}
catch(Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
}
public void Start()
{
if(!m_IsRunning)
{
try
{
m_UdpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep=new IPEndPoint(IPAddress.Any,(int)Port);
m_UdpServer.Bind(ipep);
// m_IsRunning = ThreadPool.QueueUserWorkItem(new WaitCallback(DataReceiveProc));
m_DataReceiveProcThread = new Thread(new ThreadStart(DataReceiveProc));
m_DataReceiveProcThread.Start();
m_IsRunning = true;
if(OnStateChanged != null)
OnStateChanged(this,new ServerStateChangeEventArgs(m_IsRunning));
}
catch(Exception ex)
{
throw ex;
}
}
}
~UdpServer()
{
Stop();
}
}
}
二。前台调用:
开启服务:
UdpServer server = new UdpServer(ushort.Parse(textBox1.Text), 1024);//第一个参数为服务器IP,第二个为规定传输的大小
server.OnRecivedData += new UdpServer.OnReceivedDataHandler(recive);
server.Start();
接收数据的机制:
当客户端发送数据的时候会触发由UdpServer类里的m_DataReceiveProcThread线程接收并触发OnReceivedDataHandler事件,在前台要写这个事件的实现,如下:
private void recive(object sender, EventArgs e)
{
DataReceivedEventArgs DS = (DataReceivedEventArgs)e;
string reciveDate = System.Text.Encoding.UTF8.GetString(DS.Data);//把byte[]转换为 string
}
对指定客户端发送数据:
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(cl.IPaddress), Convert.ToInt32(cl.Port));//cl.IPaddress为客户端IP,cl.Port为客户端的端口
UdpServer.m_UdpServer.Connect(ip);//调用UdpServer的静态SOCKET对象m_UdpServer来连接客户端
UdpServer.m_UdpServer.Send(System.Text.Encoding.UTF8.GetBytes(message));//把要发送的字符串转换为BYTE[]然后发送出去,字符编码要看客户端的解释定义了。
C#UDP(接收和发送源码)源码完整的更多相关文章
- python requests接收chunked编码问题-python源码修改
python requests接收chunked编码问题-python源码修改 学习了:https://blog.csdn.net/wangzuxi/article/details/40377467
- 基于PLC1850平台的UDP报文接收与发送
一.UDP报文格式 源端口(2个字节):发送报文的进程的16位端口号. 目的端口(2个字节):目的设备上的接收进程的16位端口号. 长度(2个字节):整个UDP数据报的长度,包括首都和数据字段. 校验 ...
- UDP信息接收与发送
转载:http://www.cnblogs.com/sunev/archive/2012/08/08/2627247.html 一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visua ...
- udp协议的数据接收与发送的代码
我想基于lwIP协议中的UDP协议,用单片机做一个服务器,接受电脑的指令然后返回数据.以下是我的代码 /************************************************ ...
- C#中UDP数据的发送、接收
Visual C# UDP数据的发送、接收包使用的主要类及其用法: 用Visual C# UDP协议的实现,最为常用,也是最为关键的类就是UdpClient,UdpClient位于命名空间System ...
- Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
接上篇C#的Udp广播的发送和接收 http://www.cnblogs.com/JimmyBright/p/4637090.html ios中使用AsyncUdpSocket处理Udp的消息非常方便 ...
- Udp广播的发送与接收(C#+UdpClient) 上篇
简介: Udp广播消息用在局域网的消息传递很方便.本文使用UdpClient类在WPF下实现Udp广播收发 发送: void MainWindow_Loaded(object sender, Rout ...
- 码源中国.gitignore忽略文件配置
码源中国.gitignore忽略文件配置 ## Ignore Visual Studio temporary files, build results, and ## files generated ...
- udp网络程序-发送、接收数据
1. udp网络程序-发送数据 创建一个基于udp的网络程序流程很简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: #coding=utf-8from socket im ...
随机推荐
- Qt之等待提示框(QMovie)
简述 关于gif的使用在实际项目中我用的并不多,因为我感觉瑕疵挺多的,很多时候锯齿比较严重,当然与图存在很大的关系. 关于生成gif的方法可以提供一个网站preloaders,基本是可以满足需求的. ...
- MapView的用法
一.MapView 1.显示用户的位置点(用蓝色圆点标记) mapView.showsUserLocation = YES; 2.代理方法 1> 当定位到用户的位置就会调用 - (void)ma ...
- 用canvas实现图片滤镜效果详解之灰度效果
前面展示了一些canvas实现图片滤镜效果的展示,并且给出了相应的算法,下面来介绍一下具体的实现方法. 前面介绍的特效中灰度效果最简单,就从这里开始介绍吧. 1.获取图像数据 img.src = ’h ...
- hihoCoder #1174 : 拓扑排序·一 (判断循环图)
G++ 261ms 13MB 题意: 给出n门课程的修读所需要的前置课程的关系,按理说应该是个拓扑图,但是因为某些原因导致了混乱,所以有可能不是一个拓扑图.现在的问题是,判断该图是否为一个拓扑图(即无 ...
- JProfiler 使用说明
一个全功能的 Java 剖析工具( profiler ),专用于分析 J2SE 和 J2EE 应用程序.它把 CPU .执行绪和内存的剖析组合在一个强大的 应用中. JProfiler 可提供许多 I ...
- 【英语】Bingo口语笔记(38) - See系列
see somebody off 送别 see somebody out 看到谁从哪里出来
- typedef 深入剖析
typedef是一个我们常常会用到的关键字,而这个关键字有许多陷阱或者说许多不为我们深入理解的地方.很多书上都是很简单地一笔代过,并没有真正地让我们理解这个关键字.本文对其进行详细地说明.综合网络上找 ...
- Java调优之jvm和线程的内存分析
本文来源于铁木箱子的博客http://www.mzone.cc 这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立 ...
- 大数据分析的众包平台—Kaggle
众包(Jeff Howe,2006)是一种在互联网蓬勃发展的背景下产生的一种创新的生产组织形式.在这样的商业模式下,企业利用网络将工作分配出去,通过让更合适的人群参与其中来发现创意和解决技术问题.比较 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.7. 配置资源与参数
2.7.配置资源与参数 2.7.1. 修改主机名称 [root@linuxrac1 ~]# cd /etc/sysconfig [root@linuxrac1 sysconfig]# vi netwo ...