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

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 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,6 +69,10 @@ 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;
var connectionRequest = interaction.GetNextMessageReceiving().GetAwaiter().GetResult()!;
if (connectionRequest.MessageType == EMessageType.ClientConnect)
{
foreach (var injectableModule in _injectableModules!) foreach (var injectableModule in _injectableModules!)
interaction!.Inject(injectableModule); interaction!.Inject(injectableModule);
@@ -75,13 +80,30 @@ namespace mROA.Implementation.Backend
interaction.BaseStream = client.GetStream(); interaction.BaseStream = client.GetStream();
interaction.PostMessage(new NetworkMessageHeader interaction.PostMessage(new NetworkMessageHeader(_serialization!,
{ new IdAssignment { Id = -interaction.ConnectionId }));
Id = Guid.NewGuid(), EMessageType = EMessageType.IdAssigning,
Data = _serialization!.Serialize(new IdAssignment { Id = -interaction.ConnectionId })
});
_hub!.RegisterInteraction(interaction); _hub!.RegisterInteraction(interaction);
Console.WriteLine("Client registered"); 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);
+11
View File
@@ -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;
}
} }
+15 -2
View File
@@ -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,6 +90,8 @@ namespace mROA.Implementation
throw new NullReferenceException("Serialization toolkit is null"); throw new NullReferenceException("Serialization toolkit is null");
try
{
// Console.WriteLine("Receiving message"); // Console.WriteLine("Receiving message");
var firstBit = (byte)BaseStream.ReadByte(); var firstBit = (byte)BaseStream.ReadByte();
var secondBit = (byte)BaseStream.ReadByte(); var secondBit = (byte)BaseStream.ReadByte();
@@ -99,5 +114,12 @@ namespace mROA.Implementation
return message; return message;
} }
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
} }
} }
+3 -3
View File
@@ -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