C# SilverLight Socket 客户端 核心代码(此代码有BUG只能收到一次数据)

来源:互联网 发布:南京淘宝运营培训 编辑:程序博客网 时间:2024/04/28 12:44

       
        public Page()
        {
            InitializeComponent();

            SocketOper Socket操作 = new SocketOper();
            Socket操作.SocketReceiveActive += new SocketOper.SokcetReceiveEventHandler(Socket操作_SocketReceiveActive);

          
        }

        string currSocketStr = "";

 

        void Socket操作_SocketReceiveActive(object sender, SocketOper.SocketReceiveEventArgs e)
        {
            currSocketStr = e.得到当前的字符串;
            Dispatcher.BeginInvoke(更新txt);
        }

        void 更新txt()
        {
            tt.Text = currSocketStr;
        }
    }

    /// <summary>
    /// Socket 操作类 
    /// 用于处理
    /// 得到数据 请使用
    /// SocketReceiveActive 事件
    /// </summary>
    public class SocketOper
    {
        /// <summary>
        /// 处理当前 Socket 的数据
        /// 当默认为 null
        ///
        /// </summary>
        System.Net.Sockets.Socket Socket对像用于处理 = null;

        /// <summary>
        /// Socket 异步事件参数 对像
        /// </summary>
        System.Net.Sockets.SocketAsyncEventArgs Socket异步事件参数对像 = null;


        #region 新建一个事件


        /// <summary>
        /// 为 SokcetOpet 接收数据
        /// 事件提供数据
        /// </summary>
        public class SocketReceiveEventArgs : EventArgs
        {
            private string _得到当前的字符串 = "";

            /// <summary>
            /// 得到当前的字符串
            /// </summary>
            public string 得到当前的字符串
            {
                get { return _得到当前的字符串; }
            }

            public SocketReceiveEventArgs(string Sokcet数据)
            {
                _得到当前的字符串 = Sokcet数据;
            }
        }

        /// <summary>
        /// 表示将处理当前类 Socek 接收数据 事件的方法。
        /// </summary>
        /// <param name="sender">事件源</param>
        /// <param name="e">包含事件数据的 SocketReceiveEventArgs</param>
        public delegate void SokcetReceiveEventHandler(object sender, SocketReceiveEventArgs e);

        /// <summary>
        /// 定义当前 Socket 接收数据的事件
        /// 用此事件可以得到当前 Socket 的数据
        /// </summary>
        public event SokcetReceiveEventHandler SocketReceiveActive;

        #endregion


        /// <summary>
        /// 构造函数
        /// 初始化 Socket 及联接
        /// </summary>
        public SocketOper()
        {

            //endpoint 对像
            DnsEndPoint EndPoint = new DnsEndPoint(Application.Current.Host.Source.DnsSafeHost, 4530);

            ///新的 TCP Socket对像
            Socket对像用于处理 = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);

 

            ///Socket 异步事件参数 对像
            Socket异步事件参数对像 = new System.Net.Sockets.SocketAsyncEventArgs();


            //设定异步对像的属性
            Socket异步事件参数对像.RemoteEndPoint = EndPoint;

            Socket异步事件参数对像.UserToken = Socket对像用于处理;


            ///数据完成
            Socket异步事件参数对像.Completed += new EventHandler<System.Net.Sockets.SocketAsyncEventArgs>(Socket异步事件参数对像_Completed);

            //联接
            Socket对像用于处理.ConnectAsync(Socket异步事件参数对像);

 


        }

        /// <summary>
        /// 发送对像完成
        /// 联接完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Socket异步事件参数对像_Completed(object sender, System.Net.Sockets.SocketAsyncEventArgs e)
        {
            //联接成功
            if (e.SocketError == SocketError.Success)
            {

                byte[] Socket数据 = new byte[1024];//1K
                e.SetBuffer(Socket数据, 0, Socket数据.Length);
                //删除当前的事件
                e.Completed -= new EventHandler<SocketAsyncEventArgs>(Socket异步事件参数对像_Completed);

                //当Socket完成时
                //接收数据
                e.Completed += new EventHandler<SocketAsyncEventArgs>(OnSocketReceive);

                //接收数据
                ((Socket)(e.UserToken)).ReceiveAsync(e);
            }
            else
            {
                //引 Alert 的框子
                System.Windows.Browser.HtmlPage.Window.Alert(e.SocketError.ToString());
            }

 

        }
        /// <summary>
        /// 接收 Socket 的数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnSocketReceive(object sender, SocketAsyncEventArgs e)
        {
            //新建一个新的 String Reader 对像
            StringReader Sr = null;

            #region 取得收到的信息

            try
            {
                //得到发过来的 Socket 数据据
                string data字符串数据 = System.Text.Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                Sr = new StringReader(data字符串数据);

                //将当前的 Socket 数据传入事件的数据源当中
                SocketReceiveEventArgs SokcetReceiveEvent = new SocketReceiveEventArgs(data字符串数据);

                //引起事件
                //注册事件
                SocketReceiveActive(this, SokcetReceiveEvent);
            }
            catch(Exception ex)
            {
                //将当前的 Socket 数据传入事件的数据源当中
                SocketReceiveEventArgs SokcetReceiveEvent = new SocketReceiveEventArgs(ex.ToString());

                //引起事件
                //注册事件
                SocketReceiveActive(this, SokcetReceiveEvent);
            }
            finally
            {
                Sr = null;
                Sr.Close();
                Sr.Dispose();
            }
            #endregion

            //继续得到 更多的 Socket 数据
            Socket socket = (Socket)e.UserToken;
            socket.ReceiveAsync(e);
        }

        /// <summary>
        /// 发送指定的数据
        /// </summary>
        /// <param name="str">传入当前的字符串</param>
        /// <returns></returns>
        //public bool SocketSend(string str)
        //{

        //    //byte[] bytes = (byte[])e.UserToken;
        //    //SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
        //    //sendArgs.SetBuffer(bytes, 0, bytes.Length);
        //    //sendArgs.Completed += OnSendCompleted;
        //    //socket.SendAsync(sendArgs);


        //    ///得到当前的标识
        //    Socket异步事件参数对像.UserToken = System.Text.Encoding.UTF8.GetBytes(str);

        //    //设定当前的 字节
        //    Socket异步事件参数对像.SetBuffer((byte[])Socket异步事件参数对像.UserToken, 0, ((byte[])Socket异步事件参数对像.UserToken).Length);

        //    //发送数据
        //    Socket对像用于处理.SendAsync(Socket异步事件参数对像);

        //    return true;


        //}


        /// <summary>
        /// 关闭当前 Socket联接
        /// </summary>
        public void SocketClose()
        {
            Socket对像用于处理.Close();
        }

    }

原创粉丝点击