Beispiel #1
0
        protected override void OnReceive(ClusterMessageType type)
        {
            switch (type)
            {
            case ClusterMessageType.Publish:
                var appId      = InputBuffer.Reader.Read7BitValue();
                var streamName = InputBuffer.Reader.ReadString();
                Logger.INFO(appId + ":Publish:" + streamName);
                var streamType    = InputBuffer.Reader.ReadUInt64();
                var streamId      = InputBuffer.Reader.Read7BitValue();
                var chunkSize     = InputBuffer.Reader.Read7BitValue();
                var publishType   = InputBuffer.Reader.ReadString();
                var streamManager = GetRoom(appId).StreamsManager;
                var getWaitings   = streamManager.GetWaitingSubscribers(streamName, streamType).ToArray();
                if (getWaitings.Length > 0)
                {
                    var inStream = new InClusterStream(appId, this, streamName, streamType, chunkSize);
                    InStreams[streamId] = inStream;
                    foreach (var pBaseOutStream in getWaitings)
                    {
                        pBaseOutStream.Link(inStream);
                    }
                }
                else
                {
                    if (publishType == "append" || publishType == "record")
                    {
                        var inStream = new InClusterStream(appId, this, streamName, streamType, chunkSize);
                        InStreams[streamId] = inStream;
                        streamManager.CreateOutFileStream(this, inStream, publishType == "append");
                    }
                    else
                    {
                        Send(ClusterMessageType.NoSubscriber, o =>
                        {
                            o.Write7BitValue(appId);
                            o.Write(streamName);
                        });
                    }
                }
                break;

            default:
                base.OnReceive(type);
                break;
            }
        }
Beispiel #2
0
        protected override void OnReceive(ClusterMessageType type)
        {
            string         streamName;
            uint           appId;
            StreamsManager streamManager;

            switch (type)
            {
            case ClusterMessageType.GetAppId:
                var appName = InputBuffer.Reader.ReadString();
                ClientApplicationManager.GetOrCreateRoom(appName);    //创建房间自动广播appId
                break;

            case ClusterMessageType.Publish:

                appId      = InputBuffer.Reader.Read7BitValue();
                streamName = InputBuffer.Reader.ReadString();
                var streamType  = InputBuffer.Reader.ReadUInt64();
                var streamId    = InputBuffer.Reader.Read7BitValue();
                var chunkSize   = InputBuffer.Reader.Read7BitValue();
                var publishType = InputBuffer.Reader.ReadString();

                streamManager = GetRoom(appId).StreamsManager;
                var getWaitings = streamManager.GetWaitingSubscribers(streamName, streamType);
                var inStream    = new InClusterStream(appId, this, streamName, streamType, chunkSize);
                InStreams[streamId] = inStream;
                foreach (var pBaseOutStream in getWaitings)
                {
                    pBaseOutStream.Link(inStream);
                }
                if (publishType == "append" || publishType == "record")
                {
                    streamManager.CreateOutFileStream(this, inStream, publishType == "append");
                }
                Application.GetProtocolHandler <BaseClusterAppProtocolHandler>().PublishStream(appId, inStream, publishType);
                break;

            case ClusterMessageType.NoSubscriber:
                appId         = InputBuffer.Reader.Read7BitValue();
                streamName    = InputBuffer.Reader.ReadString();
                streamManager = GetRoom(appId).StreamsManager;
                foreach (var streams in streamManager.FindByTypeByName(StreamTypes.ST_OUT_NET_CLUSTER, streamName, false, false).Values)
                {
                    streams.Dispose();
                }
                break;

            case ClusterMessageType.Play:
                appId         = InputBuffer.Reader.Read7BitValue();
                streamName    = InputBuffer.Reader.ReadString();
                streamManager = GetRoom(appId).StreamsManager;
                Logger.INFO(appId + ":Play:" + streamName);
                foreach (var streams in streamManager.FindByTypeByName(StreamTypes.ST_IN, streamName, true, false).Values)
                {
                    PublishStream(appId, streams as IInStream);
                }
                break;

            default:
                base.OnReceive(type);
                break;
            }
        }