简单 UDP 操作类

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;

namespace moniopter
{
    public static class UDPManager
    {
        //本机名称和IP
        public static string ComputerName;
        public static string ComputerIP;

        public const int listenProt = 10318;//设置端口号
        static UdpClient listener = null;//提供的网络服务
        static Thread listenter = null;//创建一个监听消息的进程
        static bool islistenter;//是否要监听
        public static Queue MsgList = new Queue();//存放所有的消息【文字类】
        static UDPManager()
        {
            ComputerName = Dns.GetHostName();
            ComputerIP = GetIPAddress();
            islistenter = true;

            //加下面这句是为了在开启线程中可以访问控件属性
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            listenter = new Thread(StartListener);
            listenter.Start();
        }

        //关闭
        public static void Close()
        {
            if (listener == null)
            {
                return;
            }
            try
            {
                listener.Close();//关闭探听消息服务
                listenter.Abort();//关闭监听消息进程
            }
            catch{  }
        }

        //获取IP
        private static string GetIPAddress()
        {
            string AddressIP = "";
            //第一种办法获取
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString().ToLower() == "internetwork")
                {
                    return _IPAddress.ToString();
                }
            }
            //第二种办法获取
            if (AddressIP == "")
            {
                IPHostEntry myEntry = Dns.GetHostEntry(System.Net.Dns.GetHostName());
                if (myEntry.AddressList.Length > 1)
                {
                    if (myEntry.AddressList[0].ToString().IndexOf(‘.‘) > 0)
                    {
                        AddressIP = myEntry.AddressList[0].ToString();
                    }
                    else
                    {
                        AddressIP = myEntry.AddressList[1].ToString();
                    }
                    AddressIP = myEntry.AddressList[1].ToString();
                }
                else
                {
                    AddressIP = myEntry.AddressList[0].ToString();
                }
            }
            return AddressIP;
        }

        public delegate void Listenter(string UIP, string msg);

        public static event Listenter OnListenter; 

        //开始监听
        private static void StartListener()
        {
            listener = new UdpClient(listenProt); //使用UDP协议
            IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenProt); //任意IP,
            try
            {
                while (islistenter)//处于监听状态
                {
                    byte[] bytes = listener.Receive(ref groupEP);
                    string Uip = groupEP.Address.ToString();//发信人的IP
                    string strInfo = Encoding.GetEncoding("gb2312").GetString(bytes, 0,
                    bytes.Length);//获得信息
                    string[] msg = { Uip, strInfo };//放入ip,和内容
                    MsgList.Enqueue(msg);
                    OnListenter(Uip, strInfo);
                }
            }
            catch { }
            finally
            {
                listener.Close();
            }
        }

        /// <summary>
        /// 发送消息 string
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="ipStr"></param>
        public static void Send(string msg, string ipStr)
        {
            Socket s = new Socket(AddressFamily.InterNetwork,
                    SocketType.Dgram, ProtocolType.Udp);
            try
            {
                IPAddress broadcast = IPAddress.Parse(ipStr);
                byte[] sendbuf = Encoding.GetEncoding("gb2312").GetBytes(msg);
                IPEndPoint ep = new IPEndPoint(broadcast, listenProt);

                //65507 可发送最大byte  64512
                if (sendbuf.Length <= 64512)
                {
                    s.SendTo(sendbuf, ep);
                }
            }
            catch { }
            finally
            {
                s.Close();
            }
        }

    }
}

  

时间: 2024-10-05 14:30:25

简单 UDP 操作类的相关文章

使用jxl操作之一: 实现对Excel简单读写操作

项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String userName; private String age; private String address; public String getUserName() { return userName; } public void setUserName(String userName) { this.

Java入门——日期操作类

Java入门——日期操作类 Date类 是一个较为简单的操作类,使用java.util.Data类的构造方法并进行输出就可以得到一个完整的日期.构造方法为: public Data(); java.util包需要导入 package Sep26; import java.util.Date; public class DataDemo01 { public static void main(String[] args) { Date date=new Date(); System.out.pri

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

一个简单的ORM制作(CURD操作类)

SQL执行类 CURD操作类 其他酱油类 此篇是为上篇文章填坑的,不知道上篇砸过来的砖头够不够,不够的话请大家继续砸. CURD操作类负责将用户提供的条件转换为SQL语句,并提供给IHelper执行,返回Model集合. CURD类需要一个接口抽象出公共方法.便于修改和扩展,提供泛型接口.为了简单起见暂时未提供JOIN的实现,可以以数据库视图替代 public interface IDbOper<T> : IDisposable where T : new() { object Insert(

PHP实现的一个简单的数据库操作类(修改版)

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $port; private $username; private $password; public $default_db; private $charset;

Android打造属于自己的数据库操作类。

1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要去做增删改查的操作的时候,就得通过getWritableDatabase获取一个SQLiteDataBase然后老老实实去写操作值的put以及查询返回的Cursor处理,其实我们可以搞一个对象来帮我们干这些事情,打造属于你自己的数据库操作类. 2.操作类的初显形 假设现在我们什么都没有,我们要去搞一

PHP 数据库操作类:ezSQL

EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.html ezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.oracle8/9 .interbase.FireBird.PostgreSQL.MS-SQL.sqlite.sqlite C++). 在你的脚本开头是要包含一个一个PHP文件.然后,你就可以使用更小.更容易的一套ezsql函数来代替标准的PHP数据库函数. 它会自动缓存的查询结果,提供了一系列简单

php中mysql数据库操作类

talk less and show code: <?php/** *以下代码用于数据库操作类的封装* * @author rex<[email protected]> * @version 1.0* @since 2015*/ class Mysql{ //数据库连接返回值 private $conn; /*** [构造函数,返回值给$conn]* @param [string] $hostname [主机名]* @param [string] $username[用户名]* @par

我的DbHelper数据操作类(转)

其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要"评估"...一评就是几个月...而且,一些公司有的根本就是裸ado.net开发,或者自己封装的数据库操作类非常别扭,很不好用.      这里我给大家共享一个我参照企业库中的数据操作组件编码风格写的数据库操作类,对使用它的程序员来说,编码是很舒服滴(起码我觉得很好撒).以下是代码,很简单的,