This commit is contained in:
SepComet
2026-03-25 13:41:15 +08:00
commit aeca7a346c
131 changed files with 12998 additions and 0 deletions
@@ -0,0 +1,32 @@
using System;
using System.Net;
using System.Threading.Tasks;
using Google.Protobuf;
using Network.Defines;
namespace Network.NetworkApplication
{
public class DelegateMessageHandler : IMessageHandler
{
private readonly Func<byte[], IPEndPoint, Task> handler;
public DelegateMessageHandler(Func<byte[], IPEndPoint, Task> handler)
{
this.handler = handler;
}
public DelegateMessageHandler(Action<byte[], IPEndPoint> handler)
{
this.handler = (msg, sender) =>
{
handler(msg, sender);
return Task.CompletedTask;
};
}
public Task HandleAsync(byte[] message, IPEndPoint sender)
{
return handler(message, sender);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c940a6a8da48ccf429215f05e2d32154
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,10 @@
using System.Net;
using System.Threading.Tasks;
namespace Network.NetworkApplication
{
public interface IMessageHandler
{
Task HandleAsync(byte[] message, IPEndPoint sender);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c46d2128446560d409c48949e2636bf1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Google.Protobuf;
using Network.Defines;
using Network.NetworkTransport;
namespace Network.NetworkApplication
{
public class MessageManager
{
private readonly ITransport transport;
private readonly Dictionary<MessageType, Func<byte[], IPEndPoint, Task>> handlers =
new Dictionary<MessageType, Func<byte[], IPEndPoint, Task>>();
public MessageManager(ITransport transport)
{
this.transport = transport;
this.transport.OnReceive += OnTransportReceiveAsync;
}
public void RegisterHandler(MessageType type, IMessageHandler handler)
{
handlers[type] = async (payload, sender) => { await handler.HandleAsync(payload, sender); };
Console.WriteLine($"[MessageManager] 注册处理器:{type}");
}
public void RegisterHandler(MessageType type, Func<byte[], IPEndPoint, Task> handler)
{
var han = new DelegateMessageHandler(handler);
RegisterHandler(type, new DelegateMessageHandler(handler));
}
public void RegisterHandler(MessageType type, Action<byte[], IPEndPoint> handler)
{
var han = new DelegateMessageHandler((msg, sender) => { handler(msg, sender); });
RegisterHandler(type, new DelegateMessageHandler((msg, sender) =>
{
handler(msg, sender);
return Task.CompletedTask;
}));
}
public void SendMessage<T>(T message, MessageType type, IPEndPoint target = null) where T : IMessage
{
var envelope = new Envelope()
{
Type = (int)type,
Payload = message.ToByteString()
};
if (target != null)
{
transport.SendTo(envelope.ToByteArray(), target);
}
else
{
transport.Send(envelope.ToByteArray());
}
Console.WriteLine($"[MessageManager] 发送消息:{type} -> {target?.ToString() ?? "default"}");
}
public void BroadcastMessage<T>(T message, MessageType type) where T : IMessage
{
Console.WriteLine($"[MessageManager] 广播消息:{type}");
var envelope = new Envelope()
{
Type = (int)type,
Payload = message.ToByteString()
};
transport.SendToAll(envelope.ToByteArray());
}
private async void OnTransportReceiveAsync(byte[] data, IPEndPoint sender)
{
try
{
var envelope = Envelope.Parser.ParseFrom(data);
var type = (MessageType)envelope.Type;
Console.WriteLine($"[MessageManager] 收到消息:{type} 来自 {sender}");
if (handlers.TryGetValue(type, out var handler))
{
await handler(envelope.Payload.ToByteArray(), sender);
}
else
{
Console.WriteLine($"[MessageManager] 警告:未注册的消息类型 {type}");
}
}
catch (Exception ex)
{
Console.WriteLine($"[MessageManager] 消息处理错误:{ex.Message}");
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 75ac30aeadd168e44a8860b22bd467c8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: