コード例 #1
0
        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);
        }
コード例 #2
0
 // 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());
         }
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
 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());
         }
     }
 }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
 protected abstract void DoSend(NetworkMessageItem item);
コード例 #7
0
        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);
        }
コード例 #8
0
 protected abstract int DoSend(NetworkMessageItem item);