C#   局域网消息广播

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace CommunicationLib
{
    /// <summary>
    /// 发送/接收广播
    /// </summary>
    public class BroadCast:BaseInfo
    {
        private Thread ThreadSendBroadInfo;
        private Thread ThreadReceiveBroadInfo;
        public bool IsBroadCase=false;//开始广播
        public bool IsRBroadCase=false;//开始接收广播
        //接收到信息时触发事件
        public delegate void ReceiveBroad(onLineInfo lnfo);
        public event ReceiveBroad receiveBroadCast;
        public event ReceiveBroad receiveLeaveMsg;
        UdpClient server;
        UdpClient udpClient;
        string IPV4BRASTCAST;
        string ip;
        IPEndPoint SendEp;
        public BroadCast() { Ini(); }
        //无法调用---使用DISPOSE方法
        ~BroadCast()
        {
            ThreadSendBroadInfo.Abort();
            ThreadReceiveBroadInfo.Abort();
        }
        public void Start()
        {
            StartSendBroadCast();
            StartReceiveBroadCast();
        }
        public void Dispose()
        {
            if (IPV4BRASTCAST == null) return;
            if (ThreadSendBroadInfo != null)
            {
                udpClient.Close();
                ThreadSendBroadInfo.Abort();
            }
            if (ThreadReceiveBroadInfo != null)
            {
              server.Close();
                ThreadReceiveBroadInfo.Abort();
            }
        }
        public BroadCast(string id,string username,string workgroup)
        {
            BaseInfo.Identifier = id;
            UserName = username;
            WorkGroup = workgroup;
            Ini();
        }
        private void Ini()
        {
            ThreadSendBroadInfo = new Thread(new ThreadStart(SendBroadInfo));
            ThreadReceiveBroadInfo = new Thread(new ThreadStart(ReceiveBroadInfo));
            ThreadReceiveBroadInfo.Name = "ReceiveBroadInfo";
            ThreadSendBroadInfo.Name = "SendBroadInfo";
            ip = BaseInfo.locaIP();
            IPV4BRASTCAST = getBroadCastIP.GetBroadCastIP(ip);
            if (IPV4BRASTCAST == null) return;
          if(SendEp==null) SendEp = new IPEndPoint(IPAddress.Parse(IPV4BRASTCAST), BaseInfo.BroadCastPort);
          if(udpClient==null) udpClient = new UdpClient();
        }
        /// <summary>
        /// 开始广播
        /// </summary>
        public void StartSendBroadCast()
        {
            if (IPV4BRASTCAST == null) return;
            if (!IsBroadCase)
            {
                ThreadSendBroadInfo.Start();
                IsBroadCase = true;
            }
        }
        /// <summary>
        /// 暂停广播
        /// </summary>
        public void StopSendBroadCast()
        {
            if (IPV4BRASTCAST == null) return;
            if (IsBroadCase)
            {
                ThreadSendBroadInfo.Suspend();
                IsBroadCase = false;
            }
        }
        /// <summary>
        /// 开始侦听广播
        /// </summary>
        public void StartReceiveBroadCast()
        {
            if (IPV4BRASTCAST == null) return;
            if (!IsRBroadCase)
            {
                ThreadReceiveBroadInfo.Start();
                IsRBroadCase = true;
            }
        }
        /// <summary>
        /// 暂停侦听广播
        /// </summary>
        public void StopReceiveBrodCast()
        {
            if (IPV4BRASTCAST == null) return;
            if (IsRBroadCase)
            {
                ThreadReceiveBroadInfo.Suspend();
                IsRBroadCase = false;
            }
        }

        /// <summary>
        /// 广播信息
        /// 格式:标识:用户名:主机名:IP:工作域
        /// </summary>
        private void SendBroadInfo()
        {
          //  getBroadCastIP.ComputBroadCastIp("210.43.8.252", "255.255.255.128");
            string computerInfo = BaseInfo.Identifier + BaseInfo.SpiltID +
                                  BaseInfo.UserName + BaseInfo.SpiltID +
                                  Dns.GetHostName() + BaseInfo.SpiltID + ip + BaseInfo.SpiltID + BaseInfo.WorkGroup;

            byte[] buff = Encoding.Default.GetBytes(computerInfo);
            while (true)
            {
                udpClient.Send(buff, buff.Length, SendEp);
              Thread.Sleep(1000);
            }
        }
        /// <summary>
        /// 离线广播
        /// </summary>
        public void SendLeaveInfo()
        {
            string computerInfo = BaseInfo.LeaveID  + BaseInfo.SpiltID +
                                  BaseInfo.UserName + BaseInfo.SpiltID +
                                  Dns.GetHostName() + BaseInfo.SpiltID + ip + BaseInfo.SpiltID + BaseInfo.WorkGroup;
                byte[] buff = Encoding.Default.GetBytes(computerInfo);
                try
                {
                    udpClient.Send(buff, buff.Length, SendEp);
                }
                catch { };
        }

      public static  List <onLineInfo> ConnectInfo = new List <onLineInfo>();


      public delegate void testdelt(string str);
      public event testdelt sssss;
        public event testdelt kkkk;
        /// <summary>
        /// 接收广播信息
        /// </summary>
        private void ReceiveBroadInfo()
        {
          
            IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
            server = new UdpClient(BaseInfo.BroadCastPort);
            while (true)
            {
                try
                {
              
                    byte[] buff= server.Receive(ref ep);
                    string[] s = Encoding.Default.GetString(buff).Split(BaseInfo.Spilt,StringSplitOptions.None); //sssss(user);
                    //在线广播
                if (s[0] == BaseInfo.Identifier)
                {

                    
                    if (ConnectInfo.Count > 0)
                    {
                        if (find(s[3]))
                        {
                            ConnectInfo.Add(new onLineInfo(s[1], s[2], s[3], s[4]));
                            if (receiveBroadCast != null) receiveBroadCast(ConnectInfo[ConnectInfo.Count - 1]);
                        }
                    }
                    else
                    {
                        ConnectInfo.Add(new onLineInfo(s[1], s[2], s[3], s[4]));
                        if (receiveBroadCast != null) receiveBroadCast(ConnectInfo[ConnectInfo.Count - 1]);
                    }
                }
                    //离线广播
                else if (s[0] == BaseInfo.LeaveID)
                {
                    onLineInfo leave = new onLineInfo(s[1], s[2], s[3], s[4]);
                    ConnectInfo.Remove(leave);
                    if (receiveLeaveMsg != null) receiveLeaveMsg(leave);
                }
                  
                }
                catch (Exception e) { /*System.Windows.Forms.MessageBox.Show(e.ToString());*/}
              Thread.Sleep(100);
            }
        }
        /// <summary>
        /// 查找是否检测到相同广播
        /// </summary>
        /// <param name="ip">IP地址 </param>
        /// <returns>相同返回FASLE </returns>
        private bool find(string ip)
        {
            for (int i = 0; i < ConnectInfo.Count; i++)
            {
                if (ip == ((onLineInfo)ConnectInfo[i]).IP) return false;
            }
            return true;
              
        }
      
    }
}



文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
评论: 0 | 引用: 0 | 查看次数: 372