/// <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); } } }
// 接收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); }
//接收服务器响应线程函数 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()); } } }