public void Send(ClusterMessageType type, object message) { var v = Variant.Get(message); Send(type, output => output.Write(v.ToBytes())); v.Recycle(); }
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; } }
public void Send(ClusterMessageType type, uint streamId, Stream pData, uint dataLength, uint processedLength, uint totalLength, uint absoluteTimestamp) { Send(type, output => { output.Write7BitValue(streamId); output.Write7BitValue(dataLength); output.Write7BitValue(processedLength); output.Write7BitValue(totalLength); output.Write7BitValue(absoluteTimestamp); pData.CopyDataTo(output.BaseStream, (int)dataLength); }); }
public void Send(ClusterMessageType type,Action<H2NBinaryWriter> writeAction) { var ms = Utils.Rms.GetStream(); using (var writer = new H2NBinaryWriter(ms)) { writer.Write((byte)type); writer.Write((ushort)0); writeAction(writer); var length = ms.Length - 3; ms.Position = 1; writer.Write((ushort)length); EnqueueForOutbound(ms); } }
public void Send(ClusterMessageType type, Action <H2NBinaryWriter> writeAction) { var ms = Utils.Rms.GetStream(); using (var writer = new H2NBinaryWriter(ms)) { writer.Write((byte)type); writer.Write((ushort)0); writeAction(writer); var length = ms.Length - 3; ms.Position = 1; writer.Write((ushort)length); EnqueueForOutbound(ms); } }
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; } }
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; } }
public override bool SignalInputData(int recAmount) { do { if (_waitlength == 0) { _currentType = (ClusterMessageType)InputBuffer.ReadByte(); _waitlength = InputBuffer.Reader.ReadUInt16(); } if (InputBuffer.AvaliableByteCounts >= _waitlength) { var pos = InputBuffer.Position; OnReceive(_currentType); if (pos + _waitlength != InputBuffer.Position) { InputBuffer.Ignore((uint)(_waitlength + pos - InputBuffer.Position)); } _waitlength = 0; } } while (_waitlength == 0 && InputBuffer.AvaliableByteCounts > 2); return(true); }
public void Send(ClusterMessageType type, InputStream message) { Send(type, output => message.CopyDataTo(output.BaseStream)); }
public void Send(ClusterMessageType type) { Send(type, output => { }); }
protected virtual void OnReceive(ClusterMessageType type) { uint streamId; string roomName=null; Variant message; uint appId; switch (type) { case ClusterMessageType.SharedObjectTrack: appId = InputBuffer.Reader.Read7BitValue(); var soName = InputBuffer.Reader.ReadString(); var version = InputBuffer.Reader.Read7BitValue(); var isPersistent = InputBuffer.Reader.ReadBoolean(); message = Deserialize(); Logger.INFO("SharedObjectTrack:{0},{1}", appId, soName); GetRoom(appId).SOManager.Process(this, soName, isPersistent, message); break; case ClusterMessageType.BroadCast: appId = InputBuffer.Reader.Read7BitValue(); message = Deserialize(); Logger.INFO("ReceiveBroadcast from {1}:{0}", message, appId); GetRoom(appId).Broadcast(this, message); break; case ClusterMessageType.Call: appId = InputBuffer.Reader.Read7BitValue(); var functionName = InputBuffer.Reader.ReadString(); message = Deserialize(); GetRoom(appId).CallFunction(functionName, this, message); break; case ClusterMessageType.Audio: FeedData(true); break; case ClusterMessageType.Video: FeedData(false); break; case ClusterMessageType.StopPublish: streamId = InputBuffer.Reader.Read7BitValue(); Logger.INFO("StopPublish:" + streamId); if (InStreams.ContainsKey(streamId)) { InStreams[streamId].Dispose(); InStreams.Remove(streamId); } break; case ClusterMessageType.StreamMessage: streamId = InputBuffer.Reader.Read7BitValue(); var length = (int)InputBuffer.Reader.Read7BitValue(); var buffer = new byte[length]; InputBuffer.Reader.Read(buffer, 0, length); //message = Deserialize(); if (InStreams.ContainsKey(streamId)) { InStreams[streamId].SendStreamMessage(new BufferWithOffset(buffer)); } break; case ClusterMessageType.Unknow: Logger.WARN("Unknow Type!"); break; default: Logger.WARN("Unknow Type :"+type); break; } }
public override bool SignalInputData(int recAmount) { do { if (_waitlength == 0) { _currentType = (ClusterMessageType) InputBuffer.ReadByte(); _waitlength = InputBuffer.Reader.ReadUInt16(); } if (InputBuffer.AvaliableByteCounts >= _waitlength) { var pos = InputBuffer.Position; OnReceive(_currentType); if (pos + _waitlength != InputBuffer.Position) InputBuffer.Ignore((uint) (_waitlength + pos - InputBuffer.Position)); _waitlength = 0; } } while (_waitlength == 0 && InputBuffer.AvaliableByteCounts > 2); return true; }
protected virtual void OnReceive(ClusterMessageType type) { uint streamId; string roomName = null; Variant message; uint appId; switch (type) { case ClusterMessageType.SharedObjectTrack: appId = InputBuffer.Reader.Read7BitValue(); var soName = InputBuffer.Reader.ReadString(); var version = InputBuffer.Reader.Read7BitValue(); var isPersistent = InputBuffer.Reader.ReadBoolean(); message = Deserialize(); Logger.INFO("SharedObjectTrack:{0},{1}", appId, soName); GetRoom(appId).SOManager.Process(this, soName, isPersistent, message); break; case ClusterMessageType.BroadCast: appId = InputBuffer.Reader.Read7BitValue(); message = Deserialize(); Logger.INFO("ReceiveBroadcast from {1}:{0}", message, appId); GetRoom(appId).Broadcast(this, message); break; case ClusterMessageType.Call: appId = InputBuffer.Reader.Read7BitValue(); var functionName = InputBuffer.Reader.ReadString(); message = Deserialize(); GetRoom(appId).CallFunction(functionName, this, message); break; case ClusterMessageType.Audio: FeedData(true); break; case ClusterMessageType.Video: FeedData(false); break; case ClusterMessageType.StopPublish: streamId = InputBuffer.Reader.Read7BitValue(); Logger.INFO("StopPublish:" + streamId); if (InStreams.ContainsKey(streamId)) { InStreams[streamId].Dispose(); InStreams.Remove(streamId); } break; case ClusterMessageType.StreamMessage: streamId = InputBuffer.Reader.Read7BitValue(); var length = (int)InputBuffer.Reader.Read7BitValue(); var buffer = new byte[length]; InputBuffer.Reader.Read(buffer, 0, length); //message = Deserialize(); if (InStreams.ContainsKey(streamId)) { InStreams[streamId].SendStreamMessage(new BufferWithOffset(buffer)); } break; case ClusterMessageType.Unknow: Logger.WARN("Unknow Type!"); break; default: Logger.WARN("Unknow Type :" + type); break; } }
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; } }