Ejemplo n.º 1
0
        public void SendPacket(IBuilderLite retpb)
        {
            if (udpClient == null)
            {
                return;
            }
            if (IsClose)
            {
                return;
            }

            //LogHelper.Log("UDP", "SendPacket: "+retpb.ToString());

            ServerBundle bundle;
            var          bytes = ServerBundle.sendImmediateError(retpb, 0, 0, out bundle);

            ServerBundle.ReturnBundle(bundle);

            var mb = new MsgBuffer()
            {
                position = 0, buffer = bytes, bundle = bundle, remoteEnd = remoteEnd
            };

            socketServer.SendUDPPacket(mb);
        }
Ejemplo n.º 2
0
        public void SendPacket(IBuilderLite retpb, uint flowId, int errorCode)
        {
            if (currentCon == null || currentCon.isClose)
            {
                return;
            }
            var bytes = ServerBundle.sendImmediateError(retpb, flowId, errorCode);

            Debug.Log("DemoServer: Send Packet " + flowId);
            lock (currentCon.msgBuffer) {
                currentCon.msgBuffer.Add(bytes);
            }
        }
Ejemplo n.º 3
0
        private void InitPlayerId()          //初始化客户端Player的ID,为每个Actor的专属ID,由ActorManager统一管理
        {
            var cmd = GCPlayerCmd.CreateBuilder();

            cmd.Result = string.Format("Init {0}", Id);

            ServerBundle bundle;
            var          bytes = ServerBundle.sendImmediateError(cmd, 0, 0, out bundle);

            ServerBundle.ReturnBundle(bundle);

            agent.SendBytes(bytes);
        }
Ejemplo n.º 4
0
        private void BroadcastToAll(GCPlayerCmd.Builder cmd)  //广播消息
        {
            var          parr = players;
            ServerBundle bundle;
            var          bytes = ServerBundle.sendImmediateError(cmd, 0, 0, out bundle);

            ServerBundle.ReturnBundle(bundle);

            foreach (var p in parr)
            {
                p.GetAgent().SendBytes(bytes);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 内部Actor将Agent要发送的消息推送给客户端
        /// SendPacket 应该以SendBuff行驶发送
        /// 同一个Socket的Write Read只能加入一次 epoll
        /// Read在初始化的时候加入
        /// Write在每次要写入的时候加入
        /// </summary>
        public void SendPacket(IBuilderLite retpb, byte flowId, byte errorCode)          //序列化Protobuff后发送数据
        {
            if (isClose)
            {
                return;
            }

            var          proto  = retpb as GCPlayerCmd.Builder;
            var          result = proto.Result;
            ServerBundle bundle;
            var          bytes = ServerBundle.sendImmediateError(retpb, flowId, errorCode, out bundle);

            //Debug.Log ("SendBytes: " + bytes.Length);
            mSendPacketCount     += 1;
            mSendPacketSizeCount += (ulong)bytes.Length;
            LogHelper.LogSendPacket(string.Format("actor={0} result={1} size={2}", id, result, bytes.Length));

            var mb = new MsgBuffer()
            {
                position = 0, buffer = bytes, bundle = bundle
            };
            var send = false;

            lock (msgBuffer)
            {
                msgBuffer.Add(mb);
                if (msgBuffer.Count == 1)                   //当msgBuffer为空并新加入一个消息时,我们才开始发送,不然在OnSend的回调中一直在发送buff,两边同时发送会有问题,
                {
                    send = true;
                }
            }
            if (send)
            {
                try
                {
                    mSocket.BeginSend(mb.buffer, mb.position, mb.Size, SocketFlags.None, OnSend, null);
                }
                catch (Exception exception)
                {
                    Debug.LogError(exception.Message);
                    Close();
                }
            }
        }