using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using System.Threading;namespace QQClass
{
public partial class UDPSocket : Component
{
private IPEndPoint ServerEndPoint = null; //定义网络端点
private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Sockets
private System.Threading.Thread thdUdp; //创建一个线程
public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port); //定义了一个托管方法
public event DataArrivalEventHandler DataArrival; //通过托管理在控件中定义一个事件
private string localHost = "127.0.0.1";
[Browsable(true), Category("Local"), Description("本地IP地址")] //在“属性”窗口中显示localHost属性
public string LocalHost
{
get { return localHost; }
set { localHost = value; }
} private int localPort = 11000;
[Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性
public int LocalPort
{
get { return localPort; }
set { localPort = value; }
} private bool active = false;
[Browsable(true), Category("Local"), Description("激活监听")] //在“属性”窗口中显示active属性
public bool Active
{
get { return active; }
set //该属性读取值
{
active = value;
if (active) //当值为True时
{
OpenSocket(); //打开监听
}
else
{
CloseSocket(); //关闭监听
}
}
}
public UDPSocket()
{
InitializeComponent();
} public UDPSocket(IContainer container)
{
container.Add(this); InitializeComponent();
} protected void Listener() //监听
{
ServerEndPoint = new IPEndPoint(IPAddress.Any,localPort); //将IP地址和端口号以网络端点存储
if (UDP_Server != null)
UDP_Server.Close();
UDP_Server = new UdpClient(localPort); //创建一个新的端口号
UDP_Server.Client.ReceiveBufferSize = 1000000000; //接收缓冲区大小
UDP_Server.Client.SendBufferSize = 1000000000; //发送缓冲区大小
try
{
thdUdp = new Thread(new ThreadStart(GetUDPData)); //创建一个线程
thdUdp.Start(); //执行当前线程
}
catch (Exception e)
{
MessageBox.Show(e.ToString()); //显示线程的错误信息
}
} private void GetUDPData() //获取当前接收的消息
{
while (active)
{
try
{
byte[] Data = UDP_Server.Receive(ref ServerEndPoint);//将获取的远程消息转换成二进制流 if (DataArrival != null)
{
DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);
}
Thread.Sleep(0);
}
catch { }
}
} private void CallBackMethod(IAsyncResult ar)
{
//从异步状态ar.AsyncState中,获取委托对象
DataArrivalEventHandler dn = (DataArrivalEventHandler)ar.AsyncState;
//一定要EndInvoke,否则你的下场很惨
dn.EndInvoke(ar);
}
public void Send(System.Net.IPAddress Host, int Port, byte[] Data)
{
try
{
IPEndPoint server = new IPEndPoint(Host, Port);
UDP_Server.Send(Data, Data.Length, server);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
} private void OpenSocket()
{
Listener();
} private void CloseSocket()
{
if (UDP_Server != null)
UDP_Server.Close();
if (thdUdp != null)
{
Thread.Sleep(30);
thdUdp.Abort();
}
}
}
}
上面是一个组件,可以添加到Form中,下面是一个添加了该组件的窗体的代码,我刚刚学习C#对委托有点不懂,请大家帮我看看代码??什么意思??不懂的代码,在下面标记了O(∩_∩)O~先谢谢了
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using System.Threading;namespace QQClass
{
public partial class UDPSocket : Component
{
private IPEndPoint ServerEndPoint = null; //定义网络端点
private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Sockets
private System.Threading.Thread thdUdp; //创建一个线程
public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port); //定义了一个托管方法
public event DataArrivalEventHandler DataArrival; //通过托管理在控件中定义一个事件
private string localHost = "127.0.0.1";
[Browsable(true), Category("Local"), Description("本地IP地址")] //在“属性”窗口中显示localHost属性
public string LocalHost
{
get { return localHost; }
set { localHost = value; }
} private int localPort = 11000;
[Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性
public int LocalPort
{
get { return localPort; }
set { localPort = value; }
} private bool active = false;
[Browsable(true), Category("Local"), Description("激活监听")] //在“属性”窗口中显示active属性
public bool Active
{
get { return active; }
set //该属性读取值
{
active = value;
if (active) //当值为True时
{
OpenSocket(); //打开监听
}
else
{
CloseSocket(); //关闭监听
}
}
}
public UDPSocket()
{
InitializeComponent();
} public UDPSocket(IContainer container)
{
container.Add(this); InitializeComponent();
} protected void Listener() //监听
{
ServerEndPoint = new IPEndPoint(IPAddress.Any,localPort); //将IP地址和端口号以网络端点存储
if (UDP_Server != null)
UDP_Server.Close();
UDP_Server = new UdpClient(localPort); //创建一个新的端口号
UDP_Server.Client.ReceiveBufferSize = 1000000000; //接收缓冲区大小
UDP_Server.Client.SendBufferSize = 1000000000; //发送缓冲区大小
try
{
thdUdp = new Thread(new ThreadStart(GetUDPData)); //创建一个线程
thdUdp.Start(); //执行当前线程
}
catch (Exception e)
{
MessageBox.Show(e.ToString()); //显示线程的错误信息
}
} private void GetUDPData() //获取当前接收的消息
{
while (active)
{
try
{
byte[] Data = UDP_Server.Receive(ref ServerEndPoint);//将获取的远程消息转换成二进制流 if (DataArrival != null)
{
DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);
}
Thread.Sleep(0);
}
catch { }
}
} private void CallBackMethod(IAsyncResult ar)
{
//从异步状态ar.AsyncState中,获取委托对象
DataArrivalEventHandler dn = (DataArrivalEventHandler)ar.AsyncState;
//一定要EndInvoke,否则你的下场很惨
dn.EndInvoke(ar);
}
public void Send(System.Net.IPAddress Host, int Port, byte[] Data)
{
try
{
IPEndPoint server = new IPEndPoint(Host, Port);
UDP_Server.Send(Data, Data.Length, server);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
} private void OpenSocket()
{
Listener();
} private void CloseSocket()
{
if (UDP_Server != null)
UDP_Server.Close();
if (thdUdp != null)
{
Thread.Sleep(30);
thdUdp.Abort();
}
}
}
}
上面是一个组件,可以添加到Form中,下面是一个添加了该组件的窗体的代码,我刚刚学习C#对委托有点不懂,请大家帮我看看代码??什么意思??不懂的代码,在下面标记了O(∩_∩)O~先谢谢了
解决方案 »
- 请教一个算法?=“1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700”
- 终于搞清了Asp.net窗体验证的来龙去脉,祝大家节日快乐,顺便散分
- 类的参数问题
- 简单问题,找不到正解!
- 请问如何使用条码字体打印的条码可以被条码枪识别得到?
- c#控制台屏蔽ctrl+c
- 打扰大家了,请教OA编程的好书
- 请帮忙看看这句SQL语句错在哪
- CLR 在 内存中 吗 ? 常见到 : 程序员在Visual C++使用了内存之后忘了释放内存,则会引起内存泄漏 , vb 是否会 ?
- C# comboBox 数据库
- 关于开发WAP站点的工具
- 大家帮忙看看json字符串反序列化为对象为什么老是空?
{
DataArrivaldelegate outdelegate = new DataArrivaldelegate(DataArrival);
//这里就不怎么懂了,下面都有点晕,请大家看看
this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port });
} private delegate void DataArrivaldelegate(byte[] Data, System.Net.IPAddress Ip, int Port); private void DataArrival(byte[] Data, System.Net.IPAddress Ip, int Port) //当有数据到达后的处理进程
{
try
{
ClassMsg msg = new ClassSerializers().DeSerializeBinary((new System.IO.MemoryStream(Data))) as ClassMsg; switch (msg.msgCommand)
{
case MsgCommand.Logined://登录成功
Publec_Class.UserID = msg.SID;
DialogResult = DialogResult.OK;
break; }
}
catch { }
}
//这里就不怎么懂了,下面都有点晕,请大家看看
this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port });
//异步调用dataArrival方法,传入参数:Data,Ip,Port三个;
// 显示主机名
string hostname = Dns.GetHostName();
// 显示每个IP地址
IPHostEntry hostent = Dns.GetHostEntry(hostname); // 主机信息
Array addrs = hostent.AddressList; // IP地址数组
//这里就不怎么懂了,下面都有点晕,请大家看看
this.BeginInvoke(outdelegate, new object[] { Data, Ip, Port }); 一方面起到线程安全作用,二方面异步执行效率也要高些~