/// <summary> /// 移除消息响应处理 /// </summary> /// <param name="protoType">消息名</param> /// <param name="e">响应函数</param> static public void RemoveCallback(ProtoID protoType, DelegateType.ProtoCallback e) { if (idToCallback.ContainsKey(protoType)) { idToCallback[protoType] -= e; } }
//添加要处理的消息 public static void addMsgObj(ProtoID protoType, MemoryStream proto) { ////若没有响应函数则不保存 分为:C#部分和Lua部分 bool luaListener = sluaAux.luaProtobuf.getInstance().hasLuaListener((int)protoType); if (!idToCallback.ContainsKey(protoType) && !luaListener) { return; } var obj = new NetThreadMsgPackage(protoType, proto); try { Monitor.Enter(_waitingForRun); _waitingForRun.Enqueue(obj); Monitor.Pulse(_waitingForRun); } finally { Monitor.Exit(_waitingForRun); } }
public void ReadHeaderFromBuffer(byte[] buffer) { if (buffer.Length < 10) { return; } for (int i = 0; i < 4; ++i) { _sumLen = _sumLen * 256 + (uint)buffer[i]; } for (int j = 4; j < 8; ++j) { _dlsn = _dlsn * 256 + (uint)buffer[j]; } uint n = 0; for (int k = 8; k < 10; ++k) { n = n * 256 + (uint)buffer[k]; } _id = (ProtoID)n; }
public void UnregisterReceiveMessage(ProtoID protoID, Action <ulong, IMessage> onReceiveMessage) { Action <ulong, IMessage> actions; if (registerContainer.TryGetValue(protoID, out actions)) { actions -= onReceiveMessage; } }
/// <summary> /// 添加脚本对象要处理的网络协议Id及其响应方法 /// </summary> /// <param name="id">协议Id</param> /// <param name="handler">进行响应的方法</param> protected void AddNetworkHandler(ProtoID id, NetworkEventHandler handler) { m_HandlerPairs.Add(new KeyValuePair <ProtoID, NetworkEventHandler> (id, handler)); // 如果脚本处于启用状态,要实时向网络管理器注册事件响应 if (this.enabled) { NetworkChangeManager.RegisterWeak(id, handler); } }
/// <summary> /// 发送消息统一接口 /// </summary> /// <param name="protoType">消息ID</param> /// <param name="msg">消息数据</param> public void SendMsg(ProtoID protoType, object msg) { clientProtoMsg.SendProtoMsg(protoType, msg); // MsgSaving saving = clientProtoMsg.SendProtoMsg(protoType, msg); // if (saving.NeedSave) // { // msgCacheMgr.AddSaving(saving); // } }
/// <summary> /// 添加消息响应处理 /// </summary> /// <param name="protoType">消息名</param> /// <param name="e">响应函数</param> public static void AddCallback(ProtoID protoType, DelegateType.ProtoCallback e) { if (idToCallback.ContainsKey(protoType)) { idToCallback[protoType] += e; } else { idToCallback[protoType] = e; } }
ReqInfo getTrdReqInfo(uint serialNo, ProtoID protoID) { lock (trdLock) { ReqInfo info; if (trdReqInfoMap.TryGetValue(serialNo, out info) && info.ProtoID == protoID) { trdReqInfoMap.Remove(serialNo); return(info); } } return(null); }
void handleTrdOnReply(uint serialNo, ProtoID protoID, object rsp) { ReqInfo reqInfo = getTrdReqInfo(serialNo, protoID); if (reqInfo != null) { lock (reqInfo.SyncEvent) { reqInfo.Rsp = rsp; Monitor.PulseAll(reqInfo.SyncEvent); } } }
protected override void OnPush(ProtoHeader protoHeader, byte[] data) { ProtoID protoID = (ProtoID)protoHeader.nProtoID; uint serialNo = protoHeader.nSerialNo; FTSPI_Trd trdCallback = null; lock (trdCallbackLock) { trdCallback = this.trdCallback; } if (trdCallback == null) { return; } switch (protoID) { case ProtoID.TrdUpdateOrder: //订单状态变动通知(推送) { Futu.OpenApi.Pb.TrdUpdateOrder.Response rsp; try { rsp = Futu.OpenApi.Pb.TrdUpdateOrder.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdUpdateOrder.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } trdCallback.OnReply_UpdateOrder(this, serialNo, rsp); } break; case ProtoID.TrdUpdateOrderFill: //成交通知(推送) { Futu.OpenApi.Pb.TrdUpdateOrderFill.Response rsp; try { rsp = Futu.OpenApi.Pb.TrdUpdateOrderFill.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdUpdateOrderFill.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } trdCallback.OnReply_UpdateOrderFill(this, serialNo, rsp); } break; } }
public static void ProcessCaches() { if (_luaStreamCaches.Count > 0) { for (var index = 0; index < _luaStreamCaches.Count; index++) { LuaStreamCache cache = _luaStreamCaches[index]; ProtoID pID = cache.id; MemoryStream mem = cache.stream; //Debug.LogWarning("发送缓存LUA消息:" + pID); sluaAux.luaProtobuf.getInstance().receiveMsg((int)pID, mem); cache.Release(); } _luaStreamCaches.Clear(); } }
/// <summary> /// 注销 消息和事件的映射关系 /// </summary> /// <param name="subject">消息Id</param> /// <param name="observer">响应事件的委托方法</param> public static void Unregister(ProtoID subject, NetworkEventHandler observer) { if (s_weakNetworkMsgMap.ContainsKey(subject)) { WeakAction weakAction = new WeakAction(observer); if (s_weakNetworkMsgMap[subject].Contains(weakAction)) { s_weakNetworkMsgMap[subject].Remove(weakAction); } if (s_weakNetworkMsgMap[subject] == null) { s_weakNetworkMsgMap.Remove(subject); } } }
//执行 static public void RunCallback(ProtoID protoType, object proto) { try { if (idToCallback.ContainsKey(protoType)) { if (idToCallback[protoType] != null) { idToCallback[protoType](proto); } } } catch (Exception e) { Debug.LogException(e); } }
public override int GetHashCode() { int hash = 1; if (ProtoID != 0) { hash ^= ProtoID.GetHashCode(); } if (PlayerID != 0UL) { hash ^= PlayerID.GetHashCode(); } if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } return(hash); }
/// <summary> /// 测试用的发送协议 /// </summary> /// <param name="body">要发送的网络协议</param> /// <param name="rspProtoId">期望收到的响应Id</param> /// <param name="timeOutHandler">协议响应超时的处理处理方法</param> public void SendTcpClientMessage(ProtoID rspProtoId, ProtoBody body, Action timeOutHandler, bool isShowWaiting = false) { //protoTimes[rspProtoId] = Time.realtimeSinceStartup; //timeOutHandlers[rspProtoId] = timeOutHandler; TimeOutData data = new TimeOutData(rspProtoId, timeOutHandler); int dataIndex = timeOutHandlers.IndexOf(data); if (dataIndex > 0) { timeOutHandlers[dataIndex].StartTime = Time.realtimeSinceStartup; } else { timeOutHandlers.Add(data); } SendTcpClientMessage(body); }
void RemoveTimeOutHandlers(ProtoID _protoId) { List <TimeOutData> timeOutInvalidList = new List <TimeOutData>(); foreach (var x in timeOutHandlers) { if (x.rspProtoId == _protoId) { timeOutInvalidList.Add(x); } } foreach (var x in timeOutInvalidList) { timeOutHandlers.Remove(x); } timeOutInvalidList.Clear(); }
/// <summary> /// 注册 消息Id和消息响应事件的回调 /// </summary> /// <param name="subject">消息Id</param> /// <param name="observer">响应事件的委托方法</param> public static void RegisterStrong(ProtoID subject, NetworkEventHandler observer) { // 已经注册过的消息就在消息列表中追加处理事件 if (s_strongNetworkMsgMap.ContainsKey(subject)) { if (s_strongNetworkMsgMap[subject].Contains(observer)) { return; } s_strongNetworkMsgMap[subject].Add(observer); } // 注册新消息 else { List <NetworkEventHandler> actions = new List <NetworkEventHandler>(); actions.Add(observer); s_strongNetworkMsgMap.Add(subject, actions); } }
/// <summary> /// 注册 消息Id和消息响应事件的回调 /// </summary> /// <param name="subject">消息Id</param> /// <param name="observer">响应事件的委托方法</param> public static void RegisterWeak(ProtoID subject, NetworkEventHandler observer) { // 已经注册过的消息就在消息列表中追加处理事件 if (s_weakNetworkMsgMap.ContainsKey(subject)) { WeakAction weakAction = new WeakAction(observer); if (s_weakNetworkMsgMap[subject].Contains(weakAction)) { return; } s_weakNetworkMsgMap[subject].Add(weakAction); } // 注册新消息 else { List <WeakAction> weakActions = new List <WeakAction>(); weakActions.Add(new WeakAction(observer)); s_weakNetworkMsgMap.Add(subject, weakActions); } }
public virtual void Dispose(bool disposing) { if (!_disposed) { // dispose managed object if (disposing) { id = 0; } // dispose unmanaged objects if (stream != null) { stream.Dispose(); } stream = null; _disposed = true; } }
//序列化 protected virtual MsgSaving GenerateStreamFromProto(ProtoID protoType, object msg) { MemoryStream serializeStream = new MemoryStream(); ProtoSerializer.Serialize(protoType, serializeStream, msg); int sumLen = (int)serializeStream.Length + 2; if (sumLen > 65536) { throw new Exception("Message Length is too large"); } /* * if (protoType == ProtoID.CS_LOGIN_RECONNECTION || protoType == ProtoID.CS_LOGIN || protoType == ProtoID.CS_COMMON_HEARTBEAT || protoType == ProtoID.CS_COMMON_PROTO_CLEAN || protoType == ProtoID.CS_COMMON_PROTO_COUNT) ||{ || return new MsgSaving(protoType, serializeStream, 0); ||} ||else * */ return(new MsgSaving(protoType, serializeStream, ClientSn)); }
//消息发送接口 public virtual MsgSaving SendProtoMsg(ProtoID protoType, object msg) { if (isDisposed) { return(default(MsgSaving)); } var save = GenerateStreamFromProto(protoType, msg); if (!ClientNetwork.Instance.IsConnected()) { //Utils.LogSys.Log("Going to Connect"); Utils.LogSys.Log("开始连接服务器"); //test._obj._txt = "Going to Connect"; // 仍未连接,先连接服务器,在连接成功后发送 // 先保存,确认成功发送后删除 ClientNetwork.Instance.ReconnectWithoutAsk(false); } else if (ClientNetwork.Instance.IsConnected()) { #if UNITY_EDITOR Utils.LogSys.Log("Send " + protoType + " proto. ulSn: " + save.Sn); #endif SendSavingMsg(save); } /* * else if (ClientNetwork.Instance.IsConnected() && protoType == ProtoID.CS_LOGIN_RECONNECTION) * { #if UNITY_EDITOR * Utils.LogSys.Log("Send " + protoType + " proto. ulSn: " + save.Sn); #endif * SendSavingMsg(save); * } * */ return(save); }
/// <summary> /// 通知响应回调方法,消息到达 /// </summary> /// <param name="subject">消息Id</param> /// <param name="msg">传递给处理方法的参数(服务器传回来的数据)</param> public static void Notify(ProtoID subject, Protocol msg) { List <WeakAction> weakHandlers = null; List <NetworkEventHandler> strongHandlers = null; //if (subject.BodyType == typeof(LuaProtoBody) && LuaMessageCallback != null) //{ // LuaMessageCallback(msg); // return; //} if (s_weakNetworkMsgMap.TryGetValue(subject, out weakHandlers)) { for (int i = weakHandlers.Count - 1; i >= 0; i--) { if (!weakHandlers[i].Invoke(msg)) { weakHandlers.RemoveAt(i); } } } else if (s_strongNetworkMsgMap.TryGetValue(subject, out strongHandlers)) { for (int i = strongHandlers.Count - 1; i >= 0; i--) { if (strongHandlers[i] != null) { strongHandlers[i](msg); } } } else { Debug.LogWarning(string.Format("消息{0}未注册事件处理方法", subject.ID)); } }
public MsgObject(ProtoID protoType, object proto) { _protoType = protoType; _proto = proto; }
public bool TryGetValue(ProtoID protoID, out Func <ulong, byte[], IMessage> value) { return(m_protoContainer.TryGetValue(protoID, out value)); }
/// <summary> /// 发送消息统一接口 /// </summary> /// <param name="protoType">消息ID</param> /// <param name="msg">消息数据</param> /// <param name="verifyCallBack">消息回包的响应函数</param> public void SendMsg(ProtoID protoType, object msg, DelegateType.OperationVerify verifyCallBack) { SendMsg(protoType, msg); }
protected override void OnReply(ReqReplyType replyType, ProtoHeader protoHeader, byte[] data) { ProtoID protoID = (ProtoID)protoHeader.nProtoID; int serialNo = protoHeader.nSerialNo; lock (this) { if (this.trdCallback == null) { return; } switch (protoID) { case ProtoID.TrdGetAccList: //获取交易账户列表 { Futu.OpenApi.Pb.TrdGetAccList.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetAccList.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetAccList.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetAccList.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetAccList(this, serialNo, rsp); } break; case ProtoID.TrdUnlockTrade: //解锁 { Futu.OpenApi.Pb.TrdUnlockTrade.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdUnlockTrade.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdUnlockTrade.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdUnlockTrade.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_UnlockTrade(this, serialNo, rsp); } break; case ProtoID.TrdSubAccPush: //订阅接收推送数据的交易账户 { Futu.OpenApi.Pb.TrdSubAccPush.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdSubAccPush.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdSubAccPush.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdSubAccPush.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_SubAccPush(this, serialNo, rsp); } break; case ProtoID.TrdGetFunds: //获取账户资金 { Futu.OpenApi.Pb.TrdGetFunds.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetFunds.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetFunds.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetFunds.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetFunds(this, serialNo, rsp); } break; case ProtoID.TrdGetPositionList: //获取账户持仓 { Futu.OpenApi.Pb.TrdGetPositionList.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetPositionList.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetPositionList.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetPositionList.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetPositionList(this, serialNo, rsp); } break; case ProtoID.TrdGetMaxTrdQtys: //获取最大交易数量 { Futu.OpenApi.Pb.TrdGetMaxTrdQtys.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetMaxTrdQtys.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetMaxTrdQtys.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetMaxTrdQtys.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetMaxTrdQtys(this, serialNo, rsp); } break; case ProtoID.TrdGetOrderList: //获取当日订单列表 { Futu.OpenApi.Pb.TrdGetOrderList.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetOrderList.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetOrderList.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetOrderList.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetOrderList(this, serialNo, rsp); } break; case ProtoID.TrdPlaceOrder: //下单 { Futu.OpenApi.Pb.TrdPlaceOrder.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdPlaceOrder.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdPlaceOrder.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdPlaceOrder.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_PlaceOrder(this, serialNo, rsp); } break; case ProtoID.TrdModifyOrder: //修改订单 { Futu.OpenApi.Pb.TrdModifyOrder.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdModifyOrder.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdModifyOrder.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdModifyOrder.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_ModifyOrder(this, serialNo, rsp); } break; case ProtoID.TrdGetOrderFillList: //获取当日成交列表 { Futu.OpenApi.Pb.TrdGetOrderFillList.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetOrderFillList.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetOrderFillList.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetOrderFillList.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetOrderFillList(this, serialNo, rsp); } break; case ProtoID.TrdGetHistoryOrderList: //获取历史订单列表 { Futu.OpenApi.Pb.TrdGetHistoryOrderList.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetHistoryOrderList.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetHistoryOrderList.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetHistoryOrderList.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetHistoryOrderList(this, serialNo, rsp); } break; case ProtoID.TrdGetHistoryOrderFillList: //获取历史成交列表 { Futu.OpenApi.Pb.TrdGetHistoryOrderFillList.Response rsp; if (replyType == ReqReplyType.SvrReply) { try { rsp = Futu.OpenApi.Pb.TrdGetHistoryOrderFillList.Response.ParseFrom(data); } catch (InvalidProtocolBufferException) { rsp = Futu.OpenApi.Pb.TrdGetHistoryOrderFillList.Response.CreateBuilder().SetRetType((int)Common.RetType.RetType_Invalid).Build(); } } else { rsp = Futu.OpenApi.Pb.TrdGetHistoryOrderFillList.Response.CreateBuilder().SetRetType((int)replyType).Build(); } this.trdCallback.OnReply_GetHistoryOrderFillList(this, serialNo, rsp); } break; } } }
public MsgSaving(ProtoID protoType, MemoryStream stream, ulong sn) { _protoType = protoType; _stream = stream; _sn = sn; }
public bool TryGetValue(ProtoID protoID, out Action <byte[]> ack) { return(m_container.TryGetValue(protoID, out ack)); }
internal ReqInfo(ProtoID protoID, object syncEvent) { this.ProtoID = protoID; this.SyncEvent = syncEvent; }
public static void PushStreamCache(ProtoID pid, MemoryStream stream) { LuaStreamCache cache = new LuaStreamCache(pid, stream); PushStreamCache(cache); }