Частичный переход на новую систему подключения
This commit is contained in:
@@ -7,7 +7,7 @@ namespace mROA.Abstract
|
|||||||
{
|
{
|
||||||
public interface INextGenerationInteractionModule : IInjectableModule
|
public interface INextGenerationInteractionModule : IInjectableModule
|
||||||
{
|
{
|
||||||
int ConnectionId { get; }
|
int ConnectionId { get; set; }
|
||||||
public Stream? BaseStream { get; set; }
|
public Stream? BaseStream { get; set; }
|
||||||
Task<NetworkMessageHeader> GetNextMessageReceiving();
|
Task<NetworkMessageHeader> GetNextMessageReceiving();
|
||||||
Task PostMessage(NetworkMessageHeader messageHeader);
|
Task PostMessage(NetworkMessageHeader messageHeader);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -68,20 +69,41 @@ namespace mROA.Implementation.Backend
|
|||||||
Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}");
|
Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}");
|
||||||
var interaction = Activator.CreateInstance(_interactionModuleType!) as INextGenerationInteractionModule;
|
var interaction = Activator.CreateInstance(_interactionModuleType!) as INextGenerationInteractionModule;
|
||||||
|
|
||||||
foreach (var injectableModule in _injectableModules!)
|
var connectionRequest = interaction.GetNextMessageReceiving().GetAwaiter().GetResult()!;
|
||||||
interaction!.Inject(injectableModule);
|
|
||||||
|
|
||||||
interaction!.Inject(_serialization);
|
if (connectionRequest.MessageType == EMessageType.ClientConnect)
|
||||||
|
|
||||||
interaction.BaseStream = client.GetStream();
|
|
||||||
|
|
||||||
interaction.PostMessage(new NetworkMessageHeader
|
|
||||||
{
|
{
|
||||||
Id = Guid.NewGuid(), EMessageType = EMessageType.IdAssigning,
|
foreach (var injectableModule in _injectableModules!)
|
||||||
Data = _serialization!.Serialize(new IdAssignment { Id = -interaction.ConnectionId })
|
interaction!.Inject(injectableModule);
|
||||||
});
|
|
||||||
_hub!.RegisterInteraction(interaction);
|
interaction!.Inject(_serialization);
|
||||||
Console.WriteLine("Client registered");
|
|
||||||
|
interaction.BaseStream = client.GetStream();
|
||||||
|
|
||||||
|
interaction.PostMessage(new NetworkMessageHeader(_serialization!,
|
||||||
|
new IdAssignment { Id = -interaction.ConnectionId }));
|
||||||
|
_hub!.RegisterInteraction(interaction);
|
||||||
|
Console.WriteLine("Client registered");
|
||||||
|
}else if (connectionRequest.MessageType == EMessageType.ClientRecovery)
|
||||||
|
{
|
||||||
|
var modidiedModules = _injectableModules!.ToList();
|
||||||
|
modidiedModules.RemoveAll(i => i is IIdentityGenerator);
|
||||||
|
|
||||||
|
foreach (var injectableModule in modidiedModules)
|
||||||
|
interaction.Inject(injectableModule);
|
||||||
|
|
||||||
|
var recoveryRequest = _serialization!.Deserialize<ClientRecovery>(connectionRequest.Data)!;
|
||||||
|
interaction.ConnectionId = recoveryRequest.Id;
|
||||||
|
|
||||||
|
interaction.Inject(_serialization);
|
||||||
|
|
||||||
|
interaction.BaseStream = client.GetStream();
|
||||||
|
|
||||||
|
interaction.PostMessage(new NetworkMessageHeader(_serialization!,
|
||||||
|
new IdAssignment { Id = -interaction.ConnectionId }));
|
||||||
|
_hub!.RegisterInteraction(interaction);
|
||||||
|
Console.WriteLine("Client registered");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ using System;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using mROA.Abstract;
|
using mROA.Abstract;
|
||||||
|
using Exception = System.Exception;
|
||||||
|
|
||||||
namespace mROA.Implementation.Frontend
|
namespace mROA.Implementation.Frontend
|
||||||
{
|
{
|
||||||
@@ -39,14 +40,17 @@ namespace mROA.Implementation.Frontend
|
|||||||
|
|
||||||
_tcpClient.Connect(_ipEndPoint);
|
_tcpClient.Connect(_ipEndPoint);
|
||||||
_interactionModule.BaseStream = _tcpClient.GetStream();
|
_interactionModule.BaseStream = _tcpClient.GetStream();
|
||||||
|
|
||||||
|
_interactionModule.PostMessage(new NetworkMessageHeader(_serialization, new ClientConnect())).Wait();
|
||||||
var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult();
|
var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult();
|
||||||
if (welcomeMessage.EMessageType != EMessageType.IdAssigning)
|
if (welcomeMessage.MessageType != EMessageType.IdAssigning)
|
||||||
{
|
{
|
||||||
throw new Exception(
|
throw new Exception(
|
||||||
$"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.EMessageType.ToString()}");
|
$"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.MessageType.ToString()}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var assignment = _serialization.Deserialize<IdAssignment>(welcomeMessage.Data)!;
|
var assignment = _serialization.Deserialize<IdAssignment>(welcomeMessage.Data)!;
|
||||||
_interactionModule.ConnectionId = -assignment.Id;
|
_interactionModule.ConnectionId = -assignment.Id;
|
||||||
TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(assignment.Id);
|
TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(assignment.Id);
|
||||||
|
|||||||
@@ -6,4 +6,15 @@ namespace mROA.Implementation
|
|||||||
|
|
||||||
public EMessageType MessageType => EMessageType.IdAssigning;
|
public EMessageType MessageType => EMessageType.IdAssigning;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ClientRecovery : INetworkMessage
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public EMessageType MessageType => EMessageType.ClientRecovery;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ClientConnect : INetworkMessage
|
||||||
|
{
|
||||||
|
public EMessageType MessageType => EMessageType.ClientConnect;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
using mROA.Abstract;
|
||||||
using mROA.Implementation.Attributes;
|
using mROA.Implementation.Attributes;
|
||||||
|
|
||||||
// ReSharper disable UnusedMember.Global
|
// ReSharper disable UnusedMember.Global
|
||||||
@@ -13,10 +14,21 @@ namespace mROA.Implementation
|
|||||||
}
|
}
|
||||||
public class NetworkMessageHeader
|
public class NetworkMessageHeader
|
||||||
{
|
{
|
||||||
|
public NetworkMessageHeader()
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid();
|
||||||
|
MessageType = EMessageType.Unknown;
|
||||||
|
Data = Array.Empty<byte>();
|
||||||
|
}
|
||||||
|
public NetworkMessageHeader(ISerializationToolkit serializationToolkit, INetworkMessage networkMessage)
|
||||||
|
{
|
||||||
|
MessageType = networkMessage.MessageType;
|
||||||
|
Data = serializationToolkit.Serialize(networkMessage);
|
||||||
|
}
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
[JsonConverter(typeof(JsonStringEnumConverter))]
|
[JsonConverter(typeof(JsonStringEnumConverter))]
|
||||||
public EMessageType EMessageType { get; set; }
|
public EMessageType MessageType { get; set; }
|
||||||
|
|
||||||
public byte[] Data { get; set; }
|
public byte[] Data { get; set; }
|
||||||
}
|
}
|
||||||
@@ -30,6 +42,7 @@ namespace mROA.Implementation
|
|||||||
IdAssigning,
|
IdAssigning,
|
||||||
CancelRequest,
|
CancelRequest,
|
||||||
EventRequest,
|
EventRequest,
|
||||||
ClientRecovery
|
ClientRecovery,
|
||||||
|
ClientConnect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,8 +14,21 @@ namespace mROA.Implementation
|
|||||||
private readonly List<NetworkMessageHeader> _messageBuffer = new(128);
|
private readonly List<NetworkMessageHeader> _messageBuffer = new(128);
|
||||||
private Task<NetworkMessageHeader>? _currentReceiving;
|
private Task<NetworkMessageHeader>? _currentReceiving;
|
||||||
private ISerializationToolkit? _serialization;
|
private ISerializationToolkit? _serialization;
|
||||||
|
private Stream? _baseStream;
|
||||||
public int ConnectionId { get; set; }
|
public int ConnectionId { get; set; }
|
||||||
public Stream? BaseStream { get; set; }
|
|
||||||
|
public Stream? BaseStream
|
||||||
|
{
|
||||||
|
get => _baseStream;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_baseStream is null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
_baseStream = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Inject<T>(T dependency)
|
public void Inject<T>(T dependency)
|
||||||
@@ -77,27 +90,36 @@ namespace mROA.Implementation
|
|||||||
throw new NullReferenceException("Serialization toolkit is null");
|
throw new NullReferenceException("Serialization toolkit is null");
|
||||||
|
|
||||||
|
|
||||||
// Console.WriteLine("Receiving message");
|
try
|
||||||
var firstBit = (byte)BaseStream.ReadByte();
|
{
|
||||||
var secondBit = (byte)BaseStream.ReadByte();
|
// Console.WriteLine("Receiving message");
|
||||||
|
var firstBit = (byte)BaseStream.ReadByte();
|
||||||
|
var secondBit = (byte)BaseStream.ReadByte();
|
||||||
|
|
||||||
var len = BitConverter.ToUInt16(new[] { firstBit, secondBit });
|
var len = BitConverter.ToUInt16(new[] { firstBit, secondBit });
|
||||||
var localSpan = _buffer[..len];
|
var localSpan = _buffer[..len];
|
||||||
|
|
||||||
await BaseStream.ReadExactlyAsync(localSpan);
|
await BaseStream.ReadExactlyAsync(localSpan);
|
||||||
|
|
||||||
// Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len]));
|
// Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len]));
|
||||||
|
|
||||||
var message = _serialization.Deserialize<NetworkMessageHeader>(localSpan.Span);
|
var message = _serialization.Deserialize<NetworkMessageHeader>(localSpan.Span);
|
||||||
#if TRACE
|
#if TRACE
|
||||||
Console.WriteLine($"{DateTime.Now.TimeOfDay} Received Message {message.Id} - {message.SchemaId}");
|
Console.WriteLine($"{DateTime.Now.TimeOfDay} Received Message {message.Id} - {message.SchemaId}");
|
||||||
TransmissionConfig.TotalTransmittedBytes += len;
|
TransmissionConfig.TotalTransmittedBytes += len;
|
||||||
Console.WriteLine($"Total recieced bytes are {TransmissionConfig.TotalTransmittedBytes}");
|
Console.WriteLine($"Total recieced bytes are {TransmissionConfig.TotalTransmittedBytes}");
|
||||||
#endif
|
#endif
|
||||||
_messageBuffer.Add(message);
|
_messageBuffer.Add(message);
|
||||||
_currentReceiving = Task.Run(async () => await GetNextMessage());
|
_currentReceiving = Task.Run(async () => await GetNextMessage());
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
return message;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ namespace mROA.Implementation
|
|||||||
var fromBuffer =
|
var fromBuffer =
|
||||||
_interaction.FirstByFilter(message =>
|
_interaction.FirstByFilter(message =>
|
||||||
(requestId is null || message.Id == requestId) &&
|
(requestId is null || message.Id == requestId) &&
|
||||||
(messageType is null || message.EMessageType == messageType));
|
(messageType is null || message.MessageType == messageType));
|
||||||
|
|
||||||
if (fromBuffer == null)
|
if (fromBuffer == null)
|
||||||
{
|
{
|
||||||
@@ -64,7 +64,7 @@ namespace mROA.Implementation
|
|||||||
{
|
{
|
||||||
var message = await _interaction.GetNextMessageReceiving();
|
var message = await _interaction.GetNextMessageReceiving();
|
||||||
if ((requestId is not null && message.Id != requestId) ||
|
if ((requestId is not null && message.Id != requestId) ||
|
||||||
(messageType is not null && message.EMessageType != messageType))
|
(messageType is not null && message.MessageType != messageType))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
_interaction.HandleMessage(message);
|
_interaction.HandleMessage(message);
|
||||||
@@ -98,7 +98,7 @@ namespace mROA.Implementation
|
|||||||
|
|
||||||
var serialized = _serialization.Serialize(payload, payloadType);
|
var serialized = _serialization.Serialize(payload, payloadType);
|
||||||
await _interaction.PostMessage(new NetworkMessageHeader
|
await _interaction.PostMessage(new NetworkMessageHeader
|
||||||
{ Id = id, EMessageType = eMessageType, Data = serialized });
|
{ Id = id, MessageType = eMessageType, Data = serialized });
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PostCallMessage<T>(Guid id, EMessageType eMessageType, T payload) where T : notnull
|
public void PostCallMessage<T>(Guid id, EMessageType eMessageType, T payload) where T : notnull
|
||||||
|
|||||||
Reference in New Issue
Block a user