public int ProcessSendQueue(bool isMultiThread = false) { int count = 0; while (_sendQueue.Count > 0 && count < MaxLoopCount) { if (isMultiThread) { count++; } try { NetworkMessageItem item = (NetworkMessageItem)_sendQueue.Dequeue(); if (IsConnected) { DoSend(item); } ObjectAllocatorHolder <MemoryStream> .Free(item.MemoryStream); } catch (Exception e) { _logger.ErrorFormat("error while do send {0} {1}", IdInfo(), e); } } return(count); }
// main Thread protected void AddToSerializeQueue(NetworkMessageItem item) { if (_recoder != null) { if (this.Id != _recoder.Info.ChannedId) { _recoder.Info.ChannedId = this.Id; _recoder.UpdateInfoToFile(); } _recoder.AddMessage(EReplayMessageType.OUT, NetworkMessageRecoder.RecodMessageItem.Allocate(this, item.MessageType, item.MessageBody, MyGameTime.stage, MyGameTime.seq, NetworkMessageRecoder.ERecodMessagetype.UdpOut)); } if (IsConnected && _serializer != null) { item.AcquireReference(); _serializeQueue.Enqueue(item); } else { if (_serializer == null) { _logger.InfoFormat("drop message for serializer not set"); } if (!IsConnected) { _logger.InfoFormat("drop message for not connected{0}", IdInfo()); } } }
protected override int DoSend(NetworkMessageItem item) { var send = 0; var msgItem = item as VNetworkMessageItem; if (null == msgItem) { Logger.ErrorFormat("message item is null or not VNetworkMessageItem {0}", IdInfo()); return(send); } switch (msgItem.Channel) { case RealTimeChannel: if (null == RealTimePeer) { Logger.ErrorFormat("{0} send failed : peer is null", IdInfo()); return(send); } _stopwatch.Reset(); long l = item.MemoryStream.Length; item.MemoryStream.Seek(0, SeekOrigin.Begin); item.MemoryStream.WriteByte((byte)(RemoteConnId >> 0)); item.MemoryStream.WriteByte((byte)(RemoteConnId >> 8)); item.MemoryStream.WriteByte((byte)(RemoteConnId >> 16)); item.MemoryStream.WriteByte((byte)(RemoteConnId >> 24)); if (item.MemoryStream.Capacity < item.MemoryStream.Length + 4) { item.MemoryStream.Capacity = item.MemoryStream.Capacity + 4; } send = (int)item.MemoryStream.Length; RealTimePeer.Send(item.MemoryStream.GetBuffer(), (int)item.MemoryStream.Length, 0); _stopwatch.Stop(); FlowSend(false, l, _stopwatch.ElapsedMilliseconds); break; case ReliableChannel: _stopwatch.Reset(); send = (int)item.MemoryStream.Length; RealiableConn.Send(item.MemoryStream.GetBuffer(), (int)item.MemoryStream.Length - 4, 4); _stopwatch.Stop(); FlowSend(true, item.MemoryStream.Length, _stopwatch.ElapsedMilliseconds); break; } return(send); }
protected void AddToSerializeQueue(NetworkMessageItem item) { if (IsConnected && _serializer != null) { item.RefMessageBody(); _serializeQueue.Enqueue(item); } else { if (_serializer == null) { _logger.InfoFormat("drop message for serializer not set"); } if (!IsConnected) { _logger.InfoFormat("drop message for not connected{0}", IdInfo()); } } }
protected override void DoSend(NetworkMessageItem item) { var msgItem = item as VNetworkMessageItem; if (null == msgItem) { Logger.ErrorFormat("message item is null or not VNetworkMessageItem {0}", IdInfo()); return; } switch (msgItem.Channel) { case RealTimeChannel: if (null == RealTimePeer) { Logger.ErrorFormat("{0} send failed : peer is null", IdInfo()); return; } _stopwatch.Reset(); long l = item.MemoryStream.Length; item.MemoryStream.Seek(0, SeekOrigin.Begin); item.MemoryStream.Write(BitConverter.GetBytes(RemoteConnId), 0, 4); RealTimePeer.Send(item.MemoryStream.GetBuffer(), (int)item.MemoryStream.Length, 0); _stopwatch.Stop(); FlowSend(false, l, _stopwatch.ElapsedMilliseconds); break; case ReliableChannel: _stopwatch.Reset(); RealiableConn.Send(item.MemoryStream.GetBuffer(), (int)item.MemoryStream.Length - 4, 4); _stopwatch.Stop(); FlowSend(true, item.MemoryStream.Length, _stopwatch.ElapsedMilliseconds); break; } }
protected abstract void DoSend(NetworkMessageItem item);
public int ProcessSerializeQueue(bool isMultiThread = false) { var count = 0; if (_serializeQueue.Count > 2000 || !IsConnected) { while (_serializeQueue.Count > 0 && count < MaxLoopCount) { if (isMultiThread) { count++; } _logger.DebugFormat("too many pending message {0}, count = {1}", ToString(), _serializeQueue.Count); NetworkMessageItem item = (NetworkMessageItem)_serializeQueue.Dequeue(); item.ReleaseMessageBody(); } } else { while (_serializeQueue.Count > 0 && count < MaxLoopCount) { if (isMultiThread) { count++; } try { NetworkMessageItem item = (NetworkMessageItem)_serializeQueue.Dequeue(); try { MemoryStream ms = ObjectAllocatorHolder <MemoryStream> .Allocate(); ms.Seek(4, SeekOrigin.Begin); DoSerialize(ms, item.MessageType, item.MessageBody); item.MemoryStream = ms; } finally { item.ReleaseMessageBody(); } if (IsConnected) { DoSend(item); } ObjectAllocatorHolder <MemoryStream> .Free(item.MemoryStream); //_sendQueue.Enqueue(item); } catch (Exception e) { _logger.ErrorFormat("error while do send {0} {1}", IdInfo(), e); } } } return(count); }
protected abstract int DoSend(NetworkMessageItem item);