public void TestMultithreadReadAndWrite() { var loginRequest = new LoginRequest() { accessToken = "askldfaljksdf", username = "******" }; var reader = new MessageStreamReader(); var writer = new MessageStreamWriter(); for (int reading = 0; reading < 50; reading++) { for (int write = 0; write < 2; write++) { writer.Write(loginRequest); Logger.Log($"Did Write loginRequest {write * reading}"); } writer.Use((buffer, len) => { Logger.Log($"Using buffer with len: {len}"); reader.Add(buffer, len); MessageContainer?message = null; while ((message = reader.Decode()).HasValue) { Logger.Log($"Decoded message: {message.Value.type}"); Assert.AreEqual(loginRequest, message.Value.Parse <LoginRequest>()); } writer.DidWrite(len); Logger.Log($"Did Write len: {len}"); }); } Assert.AreEqual(0, writer.currentBufferLength); Assert.AreEqual(0, reader.currentBufferLength); }
public MessageStreamReader BeginRead() { var msr = new MessageStreamReader(); msr.stream = this; msr.position = 0; return(msr); }
public ReliableChannel(TcpSocket socket) { this.socket = socket; this.socket.ioListener = this; this.reader = new MessageStreamReader(); this.writer = new MessageStreamWriter(); }
public void TestMessageChecksum() { byte[] bytes = new byte[] { 4, 6, 4, 6, 6, 46, 6, 34, 64, 2, 64, 62, 47, 27, 247, 4, 6, 4, 6, 6, 46, 6, 34, 64, 2, 64, 62, 47, 27, 247 }; byte[] bigBytes = new byte[8 * 1024]; Array.Copy(bytes, bigBytes, bytes.Length); var calculatedChecksum = CoderHelper.CalculateChecksum(bytes, 0, bytes.Length); var newLength = CoderHelper.AddChecksum(bigBytes, 0, bytes.Length) + bytes.Length; byte checksumInBigBytes = bigBytes[bytes.Length]; Assert.AreEqual(checksumInBigBytes, calculatedChecksum); var writer = new MessageStreamWriter(); var reader = new MessageStreamReader(); var loginRequest = new LoginRequest() { accessToken = "alsdjflakjsdf", username = "******" }; var matchRequest = new MatchRequest() { value1 = 1, value2 = 2, value3 = 3, value4 = 4 }; writer.Write(loginRequest); writer.Write(matchRequest); writer.Use((buffer, len) => { reader.Add(buffer, len); var message = reader.Decode(); Assert.IsTrue(message.Value.Is(200)); Assert.AreEqual(loginRequest, message.Value.Parse <LoginRequest>()); message = reader.Decode(); Assert.IsTrue(message.Value.Is(201)); Assert.AreEqual(matchRequest, message.Value.Parse <MatchRequest>()); writer.DidWrite(len); }); writer.Write(loginRequest); writer.Write(matchRequest); writer.currentBuffer[0] = 23; writer.Use((buffer, len) => { reader.Add(buffer, len); var message = reader.Decode(); Assert.IsFalse(message.HasValue); Assert.IsTrue(message == null); message = reader.Decode(); Assert.IsTrue(message.Value.Is(201)); Assert.AreEqual(matchRequest, message.Value.Parse <MatchRequest>()); writer.DidWrite(len); }); }
public Hash Deserialize(MessageStreamReader r, int rank) { if (rank > 256) { throw new FormatException(); } var p_algorithm = (HashAlgorithm)r.GetUInt64(); var p_value = r.GetBytes(MaxValueLength); return(new Hash(p_algorithm, p_value)); }
private void _messagingManager_ReceiveEvent(Stream responseStream) { var reader = new MessageStreamReader(new WrapperStream(responseStream), _bufferManager); var type = (AmoebaFunctionResponseType)reader.GetUInt64(); int id = (int)reader.GetUInt64(); if (_queueMap.TryGetValue(id, out var queue)) { queue.Enqueue(new ResponseInfo() { Type = type, Stream = new RangeStream(responseStream) }); } }
public void Should_return_empty_string_if_no_more_messages() { // Given var stream = new MemoryStream(); var reader = new MessageStreamReader(_logger, stream); // When String msg = reader.Read(); // Then Assert.Equal("", msg); // Finally stream.Close(); }
void IUdpSocketIOListener.SocketDidReceiveBytes(UdpSocket socket, byte[] bytes, int count, NetEndPoint from) { ThreadChecker.AssertUnreliableChannel(); if (!this.readerCollection.TryGetValue(from, out MessageStreamReader reader)) { reader = new MessageStreamReader(); this.readerCollection.TryAdd(from, reader); } reader.Add(bytes, count); MessageContainer?container; while ((container = reader.Decode()) != null) { this.listener?.ChannelDidReceiveMessage(this, container.Value, from); } }
public string Read() { messageStreamReader = new MessageStreamReader(logger, tcpClient.GetStream()); return(messageStreamReader.Read()); }
private void _messagingManager_ReceiveEvent(Stream requestStream) { var reader = new MessageStreamReader(new WrapperStream(requestStream), _bufferManager); { var type = (AmoebaFunctionType)reader.GetUInt64(); int id = (int)reader.GetUInt64(); if (type == AmoebaFunctionType.Exit) { SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); _tokenSource.Cancel(); } else if (type == AmoebaFunctionType.Cancel) { if (_tasks.TryGetValue(id, out var responseTask)) { responseTask.Stop(); } } else { var responseTask = ResponseTask.Create((token) => { try { switch (type) { case AmoebaFunctionType.GetReport: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.Report); break; } case AmoebaFunctionType.GetNetworkConnectionReports: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.GetNetworkConnectionReports()); break; } case AmoebaFunctionType.GetCacheContentReports: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.GetCacheContentReports()); break; } case AmoebaFunctionType.GetDownloadContentReports: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.GetDownloadContentReports()); break; } case AmoebaFunctionType.GetConfig: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.Config); break; } case AmoebaFunctionType.SetConfig: { var config = JsonUtils.Load <ServiceConfig>(requestStream); _serviceManager.SetConfig(config); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.SetCloudLocations: { var cloudLocations = JsonUtils.Load <Location[]>(requestStream); _serviceManager.SetCloudLocations(cloudLocations); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.GetSize: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.Size); break; } case AmoebaFunctionType.Resize: { long size = JsonUtils.Load <long>(requestStream); _serviceManager.Resize(size); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.CheckBlocks: { _serviceManager.CheckBlocks(new Action <CheckBlocksProgressReport>((report) => { SendResponse(AmoebaFunctionResponseType.Output, id, report); }), token).Wait(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.AddContent: { var arguments = JsonUtils.Load <(string, DateTime)>(requestStream); var result = _serviceManager.AddContent(arguments.Item1, arguments.Item2, token).Result; SendResponse(AmoebaFunctionResponseType.Result, id, result); break; } case AmoebaFunctionType.RemoveContent: { string path = JsonUtils.Load <string>(requestStream); _serviceManager.RemoveContent(path); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.Diffusion: { string path = JsonUtils.Load <string>(requestStream); _serviceManager.DiffuseContent(path); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.AddDownload: { var arguments = JsonUtils.Load <(Metadata, string, long)>(requestStream); _serviceManager.AddDownload(arguments.Item1, arguments.Item2, arguments.Item3); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.RemoveDownload: { var arguments = JsonUtils.Load <(Metadata, string)>(requestStream); _serviceManager.RemoveDownload(arguments.Item1, arguments.Item2); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.ResetDownload: { var arguments = JsonUtils.Load <(Metadata, string)>(requestStream); _serviceManager.ResetDownload(arguments.Item1, arguments.Item2); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.SetProfile: { var arguments = JsonUtils.Load <(ProfileContent, DigitalSignature)>(requestStream); _serviceManager.SetProfile(arguments.Item1, arguments.Item2, token).Wait(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.SetStore: { var arguments = JsonUtils.Load <(StoreContent, DigitalSignature)>(requestStream); _serviceManager.SetStore(arguments.Item1, arguments.Item2, token).Wait(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.SetUnicastCommentMessage: { var arguments = JsonUtils.Load <(Signature, CommentContent, AgreementPublicKey, DigitalSignature)>(requestStream); _serviceManager.SetUnicastCommentMessage(arguments.Item1, arguments.Item2, arguments.Item3, arguments.Item4, token).Wait(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.SetMulticastCommentMessage: { var arguments = JsonUtils.Load <(Tag, CommentContent, DigitalSignature, TimeSpan)>(requestStream); _serviceManager.SetMulticastCommentMessage(arguments.Item1, arguments.Item2, arguments.Item3, arguments.Item4, token).Wait(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.GetProfile: { var signature = JsonUtils.Load <Signature>(requestStream); var result = _serviceManager.GetProfile(signature, token).Result; SendResponse(AmoebaFunctionResponseType.Result, id, result); break; } case AmoebaFunctionType.GetStore: { var signature = JsonUtils.Load <Signature>(requestStream); var result = _serviceManager.GetStore(signature, token).Result; SendResponse(AmoebaFunctionResponseType.Result, id, result); break; } case AmoebaFunctionType.GetUnicastCommentMessages: { var arguments = JsonUtils.Load <(Signature, AgreementPrivateKey)>(requestStream); var result = _serviceManager.GetUnicastCommentMessages(arguments.Item1, arguments.Item2, token).Result; SendResponse(AmoebaFunctionResponseType.Result, id, result); break; } case AmoebaFunctionType.GetMulticastCommentMessages: { var tag = JsonUtils.Load <Tag>(requestStream); var result = _serviceManager.GetMulticastCommentMessages(tag, token).Result; SendResponse(AmoebaFunctionResponseType.Result, id, result); break; } case AmoebaFunctionType.GetState: { SendResponse(AmoebaFunctionResponseType.Result, id, _serviceManager.State); break; } case AmoebaFunctionType.Start: { _serviceManager.Start(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.Stop: { _serviceManager.Stop(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.Load: { _serviceManager.Load(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } case AmoebaFunctionType.Save: { _serviceManager.Save(); SendResponse(AmoebaFunctionResponseType.Result, id, (object)null); break; } } } catch (OperationCanceledException) { SendResponse(AmoebaFunctionResponseType.Cancel, id, (object)null); } catch (Exception e) { Log.Error(string.Format("Rpc Error: {0}", type.ToString())); Log.Error(e); var argument = new AmoebaErrorMessage(e.GetType().ToString(), e.Message, e.StackTrace?.ToString()); SendResponse(AmoebaFunctionResponseType.Error, id, argument); } finally { requestStream.Dispose(); _tasks.Remove(id); } }); _tasks.Add(id, responseTask); responseTask.Start(); } } void SendResponse <T>(AmoebaFunctionResponseType type, int id, T value) { var messageStream = new RecyclableMemoryStream(_bufferManager); var writer = new MessageStreamWriter(messageStream, _bufferManager); writer.Write((ulong)type); writer.Write((ulong)id); Stream valueStream = null; if (value != null) { try { valueStream = new RecyclableMemoryStream(_bufferManager); JsonUtils.Save(valueStream, value); } catch (Exception) { if (valueStream != null) { valueStream.Dispose(); valueStream = null; } return; } } messageStream.Seek(0, SeekOrigin.Begin); _messagingManager.Send(new UniteStream(messageStream, valueStream)); } }
public void TestPartialStreamingDecoding() { var firstToken = "asldkfjalksdjfalkjsdf"; var username = "******"; var secondToken = "asdlkfalksjdgklashdioohweg"; var ip = "10.0.0.1"; var port = (short)6109; var loginRequest = new LoginRequest { accessToken = firstToken, username = username }; var matchRequest = new MatchRequest(); var connectRequest = new ConnectGameInstanceResponse { token = secondToken, ip = ip, port = port }; var encoder = new MessageStreamWriter(); List <byte> data = new List <byte>(); encoder.Write(loginRequest); encoder.Use((buffer, count) => data.AddRange(buffer, count)); encoder.Write(matchRequest); encoder.Use((buffer, count) => data.AddRange(buffer, count)); encoder.Write(connectRequest); encoder.Use((buffer, count) => data.AddRange(buffer, count)); var decoder = new MessageStreamReader(); this.Measure(() => { var position = 0; do { var x = data.GetRange(position, 1).ToArray(); decoder.Add(x, x.Length); var container = decoder.Decode(); if (container.HasValue) { if (container.Value.Is(200)) // LoginRequest { var message = container.Value.Parse <LoginRequest>(); Assert.AreEqual(message.accessToken, firstToken); Assert.AreEqual(message.username, username); } else if (container.Value.Is(201)) // MatchRequest { var message = container.Value.Parse <MatchRequest>(); Assert.AreNotEqual(message, null); } else if (container.Value.Is(202)) // ConnectGameInstanceResponse { var message = container.Value.Parse <ConnectGameInstanceResponse>(); Assert.AreEqual(message.ip, ip); Assert.AreEqual(message.port, port); Assert.AreEqual(message.token, secondToken); } } position += 1; } while (position < data.Count); }, "Partial Stream Decoding"); }