其实,这个项目(暂且让我把这个也成为项目吧),我觉得核心的地方就是UPDSocket的设计方面,一开始,我看一个制造QQ的书,上面直接用的是组件技术,但是,我上网查了查,啥时组件,组件(Component)是对数据和方法的简单封装。我觉得,这不就是类吗?所以,我就直接使用了类,但是在开发的过程中,遇到了很多的问题,主要的问题就是关于端口的使用,如何你使用类来完成UDPSocket的话,你应该时刻注意开启简单的位置,因为一不小心就会出现端口问题。所有,到最后,我直接就用了组件,其实到现在我也不是很懂组件和类到底用啥实质性的差别,因为,我直接Copy了别人一个成功的UPDSocket组件,这里面的主要的代码如下:
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 = "192.168.1.2";
[Browsable(true), Category("Local"), Description("本地IP地址")] //在“属性”窗口中显示localHost属性
public string LocalHost
{
get { return localHost; }
set { localHost = value; }
}
private int localPort = 11110;
[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();
}
}
}
如果你觉得代码和别人的很相似,那么就对了,因为,我就是Copy别人的。