Ejemplo n.º 1
0
        /// <summary>
        /// 发送XmlTreeNode包
        /// </summary>
        /// <param name="ns"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        public static bool SendPackage(NetworkStream ns, AbstractXiepPackage xiepPackage)
        {
            if (ns == null || xiepPackage == null)
            {
                return(false);
            }

            lock (ns)
            {
                String responseNodeString = xiepPackage.ToXml();
                try
                {
                    Byte[] buffer = XiepIoHelper.getEncoding().GetBytes(responseNodeString);
                    //写数据包大小
                    Byte[] packageSizeBuffer = NumberHelper.intToByte(buffer.Length);
                    ns.Write(packageSizeBuffer, 0, packageSizeBuffer.Length);
                    //写数据包内容
                    ns.Write(buffer, 0, buffer.Length);
                    ns.Flush();

                    return(true);
                }
                catch
                {
                    return(false);
                }
            }
        }
Ejemplo n.º 2
0
        // 接收AbstractXiepPackage包
        public static AbstractXiepPackage ReceivePackage(NetworkStream ns)
        {
            String xml = ReceiveXml(ns);

            if (String.IsNullOrEmpty(xml))
            {
                return(null);
            }

            AbstractXiepPackage rtnPackage = null;

            XmlTreeNode treeNode    = XmlTreeNode.FromXml(xml);
            String      packageName = treeNode.Key;

            if (packageName.Equals("RequestPackage"))
            {
                rtnPackage = new RequestPackage();
            }
            else if (packageName.Equals("ResponsePackage"))
            {
                rtnPackage = new ResponsePackage();
            }
            else if (packageName.Equals("EventPackage"))
            {
                rtnPackage = new EventPackage();
            }
            else
            {
                return(null);
            }

            rtnPackage.SetRootPackage(treeNode);
            return(rtnPackage);
        }
Ejemplo n.º 3
0
        //接收服务器响应线程函数
        private void receiveResponseThreadFunction()
        {
            try
            {
                while (true)
                {
                    //接收请求包
                    AbstractXiepPackage recvPackage = XiepIoHelper.ReceivePackage(_networkStream);
                    if (recvPackage == null)
                    {
                        throw new IOException("获取数据包失败。");
                    }

                    //如果是响应数据包
                    if (recvPackage is ResponsePackage)
                    {
                        ResponsePackage responsePackage = (ResponsePackage)recvPackage;
                        String          requestId       = responsePackage.RequestId;
                        lock (_mapRequestResponse)
                        {
                            if (_mapRequestResponse.ContainsKey(requestId))
                            {
                                _mapRequestResponse.Remove(requestId);
                                _mapRequestResponse.Add(requestId, responsePackage);
                            }
                        }
                    } //如果是事件数据包
                    else if (recvPackage is EventPackage)
                    {
                        EventPackage eventPackage = (EventPackage)recvPackage;
                        //触发收到服务器事件的事件
                        if (ServerEventCame != null)
                        {
                            ServerEventCame.BeginInvoke(this, new XiepClientEventArgs(eventPackage), new AsyncCallback(delegate(IAsyncResult iar) { }), null);
                        }
                    }
                }
            }
            catch
            {
                _networkStream = null;
                _socket        = null;

                //触发与服务器连接断开事件
                if (ServerDisconnected != null)
                {
                    //ServerDisconnected.BeginInvoke(this, new System.EventArgs(), new AsyncCallback(delegate(IAsyncResult iar) { }), this);
                    ServerDisconnected.Invoke(this, new System.EventArgs());
                }
            }
        }