C# 局域网消息广播
作者:fovly 日期:2009-10-24
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;
}
}
}
评论: 0 | 引用: 0 | 查看次数: 372
上一篇
下一篇


文章来自:
Tags:
:805936076






