Частичный переход на новую систему подключения

This commit is contained in:
2025-03-31 12:27:46 +03:00
parent 2851a85d1c
commit db110e197c
7 changed files with 106 additions and 34 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ namespace mROA.Abstract
{
public interface INextGenerationInteractionModule : IInjectableModule
{
int ConnectionId { get; }
int ConnectionId { get; set; }
public Stream? BaseStream { get; set; }
Task<NetworkMessageHeader> GetNextMessageReceiving();
Task PostMessage(NetworkMessageHeader messageHeader);
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
@@ -68,6 +69,10 @@ namespace mROA.Implementation.Backend
Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}");
var interaction = Activator.CreateInstance(_interactionModuleType!) as INextGenerationInteractionModule;
var connectionRequest = interaction.GetNextMessageReceiving().GetAwaiter().GetResult()!;
if (connectionRequest.MessageType == EMessageType.ClientConnect)
{
foreach (var injectableModule in _injectableModules!)
interaction!.Inject(injectableModule);
@@ -75,13 +80,30 @@ namespace mROA.Implementation.Backend
interaction.BaseStream = client.GetStream();
interaction.PostMessage(new NetworkMessageHeader
{
Id = Guid.NewGuid(), EMessageType = EMessageType.IdAssigning,
Data = _serialization!.Serialize(new IdAssignment { Id = -interaction.ConnectionId })
});
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.Sockets;
using mROA.Abstract;
using Exception = System.Exception;
namespace mROA.Implementation.Frontend
{
@@ -39,14 +40,17 @@ namespace mROA.Implementation.Frontend
_tcpClient.Connect(_ipEndPoint);
_interactionModule.BaseStream = _tcpClient.GetStream();
_interactionModule.PostMessage(new NetworkMessageHeader(_serialization, new ClientConnect())).Wait();
var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult();
if (welcomeMessage.EMessageType != EMessageType.IdAssigning)
if (welcomeMessage.MessageType != EMessageType.IdAssigning)
{
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)!;
_interactionModule.ConnectionId = -assignment.Id;
TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(assignment.Id);
+11
View File
@@ -6,4 +6,15 @@ namespace mROA.Implementation
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;
}
}
+15 -2
View File
@@ -1,5 +1,6 @@
using System;
using System.Text.Json.Serialization;
using mROA.Abstract;
using mROA.Implementation.Attributes;
// ReSharper disable UnusedMember.Global
@@ -13,10 +14,21 @@ namespace mROA.Implementation
}
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; }
[JsonConverter(typeof(JsonStringEnumConverter))]
public EMessageType EMessageType { get; set; }
public EMessageType MessageType { get; set; }
public byte[] Data { get; set; }
}
@@ -30,6 +42,7 @@ namespace mROA.Implementation
IdAssigning,
CancelRequest,
EventRequest,
ClientRecovery
ClientRecovery,
ClientConnect
}
}
@@ -14,8 +14,21 @@ namespace mROA.Implementation
private readonly List<NetworkMessageHeader> _messageBuffer = new(128);
private Task<NetworkMessageHeader>? _currentReceiving;
private ISerializationToolkit? _serialization;
private Stream? _baseStream;
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)
@@ -77,6 +90,8 @@ namespace mROA.Implementation
throw new NullReferenceException("Serialization toolkit is null");
try
{
// Console.WriteLine("Receiving message");
var firstBit = (byte)BaseStream.ReadByte();
var secondBit = (byte)BaseStream.ReadByte();
@@ -99,5 +114,12 @@ namespace mROA.Implementation
return message;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
}
+3 -3
View File
@@ -56,7 +56,7 @@ namespace mROA.Implementation
var fromBuffer =
_interaction.FirstByFilter(message =>
(requestId is null || message.Id == requestId) &&
(messageType is null || message.EMessageType == messageType));
(messageType is null || message.MessageType == messageType));
if (fromBuffer == null)
{
@@ -64,7 +64,7 @@ namespace mROA.Implementation
{
var message = await _interaction.GetNextMessageReceiving();
if ((requestId is not null && message.Id != requestId) ||
(messageType is not null && message.EMessageType != messageType))
(messageType is not null && message.MessageType != messageType))
continue;
_interaction.HandleMessage(message);
@@ -98,7 +98,7 @@ namespace mROA.Implementation
var serialized = _serialization.Serialize(payload, payloadType);
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