项目实战TT(二) UDPsocket篇

    其实,这个项目(暂且让我把这个也成为项目吧),我觉得核心的地方就是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别人的。

posted on 2012-02-22 20:47  lufangtao  阅读(1191)  评论(0编辑  收藏  举报

导航