• 项目实战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别人的。

  • 相关阅读:
    nginx+php-fpm 配置和错误总结
    C#——Winform 无边框随意拖动【转载】
    C#——Socket
    asp.net——Base64加密解密
    asp.net——上传图片生成缩略图
    C#——获取远程xml文件
    SQL Server—— 如何创建定时作业
    asp.net——正则表达式
    asp.net——Josn转DataTable(转)
    JS——EasyuiCombobox三级联动
  • 原文地址:https://www.cnblogs.com/lufangtao/p/2363794.html
Copyright © 2020-2023  润新知