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(接收和发送源码)源码完整的更多相关文章

  1. python requests接收chunked编码问题-python源码修改

    python requests接收chunked编码问题-python源码修改 学习了:https://blog.csdn.net/wangzuxi/article/details/40377467

  2. 基于PLC1850平台的UDP报文接收与发送

    一.UDP报文格式 源端口(2个字节):发送报文的进程的16位端口号. 目的端口(2个字节):目的设备上的接收进程的16位端口号. 长度(2个字节):整个UDP数据报的长度,包括首都和数据字段. 校验 ...

  3. UDP信息接收与发送

    转载:http://www.cnblogs.com/sunev/archive/2012/08/08/2627247.html 一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visua ...

  4. udp协议的数据接收与发送的代码

    我想基于lwIP协议中的UDP协议,用单片机做一个服务器,接受电脑的指令然后返回数据.以下是我的代码 /************************************************ ...

  5. C#中UDP数据的发送、接收

    Visual C# UDP数据的发送、接收包使用的主要类及其用法: 用Visual C# UDP协议的实现,最为常用,也是最为关键的类就是UdpClient,UdpClient位于命名空间System ...

  6. Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇

    接上篇C#的Udp广播的发送和接收 http://www.cnblogs.com/JimmyBright/p/4637090.html ios中使用AsyncUdpSocket处理Udp的消息非常方便 ...

  7. Udp广播的发送与接收(C#+UdpClient) 上篇

    简介: Udp广播消息用在局域网的消息传递很方便.本文使用UdpClient类在WPF下实现Udp广播收发 发送: void MainWindow_Loaded(object sender, Rout ...

  8. 码源中国.gitignore忽略文件配置

    码源中国.gitignore忽略文件配置 ## Ignore Visual Studio temporary files, build results, and ## files generated ...

  9. udp网络程序-发送、接收数据

    1. udp网络程序-发送数据 创建一个基于udp的网络程序流程很简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: #coding=utf-8from socket im ...

随机推荐

  1. [置顶] Android Provision (Setup Wizard)

    Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一 个冗余的实现.Android中的Provision其实 ...

  2. You can't specify target table 'charge' for update in FROM clause

    mysql中不能这么用. (等待mysql升级吧)错误提示就是说,不能先select出同一表中的某些值,再update这个表(在同一语句中) 替 换方 案: create table tmp as s ...

  3. 函数lock_rec_has_expl

    判断是否预加锁的模式 要强壮于 已添加的lock锁模式 /*********************************************************************// ...

  4. UploadifyAPI-上传插件属性和方法介绍

    上一篇文章简单的介绍了Uploadify上传插件的使用.但是对于常用的属性和方法并没有说明.授人以鱼不如授人以渔,我决定将常用的属性列举出来,供大伙参考参考.           Uploadify属 ...

  5. [转] POJ字符串分类

    POJ 1002 - 487-3279(基础)http://acm.pku.edu.cn/JudgeOnline/problem?id=1002题意:略解法:二叉查找数,map,快排... POJ 1 ...

  6. Cocoa & Cocoa Touch概念

    Application Kit框架包括广泛的类和方法,它们用来开发交互式图形应用程序,使得开发文本/菜单/工具栏/表/文档/剪贴板和窗口之类的过程变得十分简便.在Mac OSX操作系统中,术语coco ...

  7. [ ] 字符组(Character Classes) (转)

    []能够匹配所包含的一系列字符中的任意一个.需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个. 例如[abc]表示字符“a”或“b”或“c”. []支持用连字符“- ...

  8. 物联网操作系统HelloX V1.79发布公告

    经过HelloX开发团队近半年的努力,在HelloX V1.78版本基础上,增加许多功能特性,并对V1.78版本的一些特性进行了进一步优化之后,正式形成HelloX V1.79测试版本.经相对充分的测 ...

  9. ecshop 修改模板可输出php代码

    1.找到includes 文件夹下的 cls_template.php function fetch_str函数 2.只留下以下代码 function fetch_str($source) { if ...

  10. Android Retrofit实现原理分析

    retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...