protected bool ProcessBean(NetSession session, IBean bean) // 同步处理bean,异常会抛出; { int serial = bean.Serial; if (serial < 0) { BeanContext beanCtx; if (_beanCtxMap.TryGetValue(-serial, out beanCtx)) { _beanCtxMap.Remove(-serial); AnswerDelegate onAnswer = beanCtx.onAnswer; if (onAnswer != null) { try { onAnswer(bean); } catch (Exception) {} return(true); } } } HandlerDelegate handler; if (HandlerMap == null || !HandlerMap.TryGetValue(bean.Type(), out handler)) { return(false); } handler(session, bean); return(true); }
protected virtual void OnRecvBean(NetSession session, IBean bean) // 在Tick解协议过程中解出一个bean时回调,默认会同步处理bean并忽略异常; { try { ProcessBean(session, bean); } catch (Exception) {} }
public static void Actualizar(IBean bean) { coreContext coreContext = Session.GetContexto(); var set = coreContext.Set(bean.GetType()); set.Add(bean); coreContext.Entry(bean).State = System.Data.Entity.EntityState.Modified; }
} // 由Tick方法回调,异常会触发Close(CLOSE_DECODE); void OnRecv(NetSession session, int size) { OctetsStream recvBuf = session.recvBuf; OctetsStream os = OnDecode(session, recvBuf.Array(), recvBuf.Size(), size); if (os != null) { recvBuf.Append(os.Array(), os.Position(), os.Remain()); } else { recvBuf.Resize(recvBuf.Size() + size); } int pos = 0; try { while (recvBuf.Remain() >= 4) // type+serial+size+bean; { int ptype = recvBuf.UnmarshalUInt(); int pserial = recvBuf.UnmarshalInt(); int psize = recvBuf.UnmarshalUInt(); if (psize > recvBuf.Remain()) { break; } int ppos = recvBuf.Position(); pos = ppos + psize; BeanDelegate create; if (BeanMap == null || !BeanMap.TryGetValue(ptype, out create)) { OnRecvUnknownBean(session, ptype, pserial, psize); recvBuf.SetPosition(pos); } else { IBean bean = create(); bean.Unmarshal(recvBuf); int realsize = recvBuf.Position() - ppos; if (realsize > psize) { throw new Exception("bean realsize overflow: type=" + ptype + ",serial=" + pserial + ",size=" + psize + ",realsize=" + realsize); } bean.Serial = pserial; OnRecvBean(session, bean); } } } catch (MarshalEOFException) {} finally { recvBuf.Erase(0, pos); recvBuf.SetPosition(0); } }
/** * 接收到每个完整的bean都会调用此方法; * 一般在这里立即同步处理协议,也可以先放到接收队列里,合适的时机处理; */ protected override void OnRecvBean(NetSession session, IBean bean) { try { ProcessBean(session, bean); } catch (Exception e) { LogException(e); } }
/*\ |*| int TEST_CONST1 = 5; // 测试类静态常量; |*| string TEST_CONST2 = "test_const2"; |*| int value1; // 字段的注释; |*| long value2; \*/ public static void OnProcess(NetManager.NetSession session, IBean _arg_) { TestBean arg = (TestBean)_arg_; System.Console.WriteLine("{0}.onProcess: arg={1}", arg.GetType().Name, arg); RC4Filter filter = new RC4Filter(); filter.SetInputKey(new byte[] { 1, 2, 3 }, 3); filter.SetOutputKey(new byte[] { 1, 2, 3 }, 3); ((TestClient)session.manager).SetFilter(filter); session.Send(arg); }
public HttpResponseMessage movimientosfecha(ConsultaFecha consultaFecha) { Response resp = new Response(); coreContext contexto = new coreContext(); Session.FijarContexto(contexto); List <tpagmovimiento> movimientos = TpagMovimientoDal.buscar(consultaFecha.identificacion, consultaFecha.finicio, consultaFecha.ffin); List <IBean> reg = new List <IBean>(); foreach (tpagmovimiento mov in movimientos) { IBean b = (IBean)mov; reg.Add(b); } resp.lregistros = reg; return(GetResponse(resp)); }
// 序列化bean,经过OnEncode处理后,放入待发送队列准备发送,调用后可以修改bean; public virtual void Send(NetSession session, IBean bean) { if (session.Closed || bean == null) { return; } int type = bean.Type(); int serial = bean.Serial; int reserveLen = OctetsStream.MarshalUIntLen(type) + OctetsStream.MarshalLen(serial) + 5; OctetsStream buf = new OctetsStream(reserveLen + bean.InitSize()); buf.Resize(reserveLen); int len = bean.Marshal(buf).Size(); int pos = 5 - buf.MarshalUIntBack(reserveLen, len - reserveLen); buf.Resize(pos); buf.MarshalUInt(type).Marshal(serial); buf.SetPosition(pos); buf.Resize(len); OctetsStream os = OnEncode(session, buf.Array(), buf.Position(), buf.Remain()); SendDirect(session, os ?? buf); }
public bool Ask(NetSession session, IBean bean, AnswerDelegate onAnswer = null) { if (session.Closed || bean == null) { return(false); } for (BeanContext beanCtx;;) { int serial = ++_serialCounter; if (serial > 0) { if (_beanCtxMap.ContainsKey(serial)) { continue; // 确保一下; } _beanCtxMap.Add(serial, beanCtx = new BeanContext(serial, onAnswer)); _beanCtxQueue.Enqueue(beanCtx); bean.Serial = serial; Send(session, bean); return(true); } _serialCounter = 0; } }
/*\ |*| bool v1; // 1字节布尔,0表示假,1表示真,其它默认表示真; |*| sbyte v2; // 1字节整数; |*| short v3; // 2字节整数; |*| int v4; // 4字节整数; |*| long v5; // 8字节整数; |*| float v6; // 4字节浮点数; |*| double v7; // 8字节浮点数; |*| Octets v8; // 二进制数据(Octets); |*| string v9; // 字符串(String); |*| List<bool> v10; // 数组容器(ArrayList); |*| LinkedList<sbyte> v11; // 链表容器(LinkedList); |*| LinkedList<int> v12; // 队列容器(ArrayDeque); |*| HashSet<long> v13; // 无序集合容器(HashSet); |*| HashSet<float> v14; // 排序集合容器(TreeSet); |*| HashSet<double> v15; // 有序集合容器(LinkedHashSet); |*| Dictionary<long, string> v16; // 无序映射容器(HashMap); |*| SortedDictionary<TestBean, bool> v17; // 排序映射容器(TreeMap); |*| Dictionary<Octets, TestBean> v18; // 有序映射容器(LinkedHashMap); |*| TestBean v19; // 嵌入其它bean; \*/ public static void OnProcess(NetManager.NetSession session, IBean _arg_) { TestType arg = (TestType)_arg_; System.Console.WriteLine("{0}.onProcess: arg={1}", arg.GetType().Name, arg); }
public void Send(IBean bean) { manager.Send(this, bean); }
public int CompareTo(IBean b) { throw new NotSupportedException(); }
public int CompareTo(IBean b) { return(b is TestEmpty?CompareTo((TestEmpty)b) : 1); }
public int CompareTo(IBean b) { return(b is TestType?CompareTo((TestType)b) : 1); }
public StandardBeanDispencer(IBean bean) { BeanType = bean; DispencerSize = 20; }
public int CompareTo(IBean b) { return(b is TestBean?CompareTo((TestBean)b) : 1); }