# 这是什么?
这是一个 ~~简单易用的~~ 网络库。
这是一个网络模块的通用解决方案。设计目的为应用程序网络模块提供统一的HighLevel接口。
整个类库被拆分为多个dll。**简单来说:NetRemoteStandard.dll是标准,里面只有接口定义;Megumin.Remote.dll是一种实现。类比于dotnetStandard和dotnetCore的关系。**
> 为什么要拆分为多个dll?
> 具体实现可能需要依赖很多其他dll,而接口定义并不需要这些依赖。对于只想使用接口,自定义实现的用户来说,引入额外的依赖是不必要的。例如MessageStandard,用户仅引用自己选择的序列化库即可,而不必引用多个序列化库。
# [Dll依赖关系与架构](Image/项目结构.png)
![依赖关系](Image/项目结构.png)
---
---
# 它是开箱即用的么?
是的,使用Nuget获取Megumin.Remote。但是注意,需要搭配序列化库,不同的序列化库可能有额外的要求。
~~由于使用了C# 7.3语法,在unity中如果使用源码至少需要2018.3。~~
目标框架netstandard2.1,在unity中建议unity版本2021.2以上。过小的版本可以使用源码,但需要自行解决依赖关系。
# UPM Package
## Install via git URL
![image](https://user-images.githubusercontent.com/46207/79450714-3aadd100-8020-11ea-8aae-b8d87fc4d7be.png)
or add `"com.megumin.net": "https://github.com/KumoKyaku/Megumin.Net.git?path=UnityPackage/Packages/Net"` to `Packages/manifest.json`.
>If you want to set a target version, uses the `*.*.*` release tag so you can specify a version like `#2.1.0`. For example `https://github.com/KumoKyaku/Megumin.Net.git?path=UnityPackage/Packages/Net#2.1.0`.
# 快速入门
- [bilibili视频教程](https://www.bilibili.com/video/BV1We4y1J7EU/)
[<img src="http://i2.hdslb.com/bfs/archive/7f79a0fe4f98624abb1619dfb6a34090fcca4967.png" width = "480" height = "270">](https://www.bilibili.com/video/BV1We4y1J7EU/)
---
---
# 优势
- 支持Tcp,Udp,Kcp。
- 使用内存池和多线程处理收发,可配置线程调度,无需担心网络模块性能问题。
- 内置Rpc。
- 可以搭配不同的序列化类库,甚至不用序列化库。
- **AOT/IL2CPP可用。**
- 可重写的消息管线,专业程序员可以针对具体功能进一步优化。
- 接口分离。[[Dependency injection]](https://en.wikipedia.org/wiki/Dependency_injection) 应用程序可以仅使用NetRemoteStandard.dll编码,然后使用Megumin.Remote.dll的具体实现类注入,当需要切换协议或者序列化类库时,应用程序逻辑无需改动。
- IOCP开销和消息调度转发延迟之间有很好的平衡。
- 自定义MiniTask池,针对网络功能对Task重新实现,性能更高,仅初始化时alloc。
- 支持`Span<T>`。使用[`System.IO.Pipelines`](https://www.cnblogs.com/xxfy1/p/9290235.html)作为高性能IO缓冲区。
- 纯C#实现,这是学习网络功能一个好的起点。
- 3.0 版本 API设计经过真实业务需求改良。
- **`MIT许可证`**
# 劣势
- ~~目前为止类库还很年青,没有经过足够的商业项目测试。~~
- 不持支 WebGL Networking
- 对于非程序人员仍然需要一些学习成本。独立游戏作者用起来还是有一定难度的。
+ [类库没有解决操作系统的时间精度问题。](https://stackoverflow.com/questions/6254703/thread-sleep-for-less-than-1-millisecond)这个问题非常复杂,需要专人定制。
---
---
# 核心方法3个
设计原则:最常用的代码最简化,复杂的地方都封装起来。
`发送一个消息,并等待一个消息返回` 是类库的全部内容。
---
## 1. [ISendAsyncable.SendAsync](Image/callstep.png)
从结果值返回异常是有意义的:
- 省去了try catch ,写法更简单,避免try catch 控制流。(注意,没有提高处理异常的性能)
- 用来支持异常在分布式服务器中传递。
```cs
///实际使用中的例子
IRemote remote = new TCPRemote(); ///省略连接代码……
public async void TestSend()
{
Login login = new Login() { Account = "LiLei", Password = "HanMeiMei" };
/// 泛型类型为期待返回的类型
var (result, exception) = await remote.SendAsync<LoginResult>(login);
///如果没有遇到异常,那么我们可以得到远端发回的返回值
if (exception == null)
{
Console.WriteLine(result.IsSuccess);
}
}
```
---
## 2. ISendAsyncable.SendAsyncSafeAwait
方法签名:
```cs
ValueTask<Result> SendAsyncSafeAwait<Result>(object message, object options = null, Action<Exception> onException = null);
```
结果值是保证有值的,如果结果值为空或其他异常,触发异常回调函数,不会抛出异常,所以不用try catch。`异步方法的后续部分不会触发`,所以后续部分可以省去空检查。
(``注意:这不是语言特性,也不是异步编程特性,这依赖于具体Remote的实现,这是类库的特性。如果你使用了这个接口的其他实现,要确认实现遵守了这个约定。``)
```cs
IRemote remote = new TCPRemote(); ///省略连接代码……
public async void TestSend()
{
Login login = new Login() { Account = "LiLei", Password = "HanMeiMei" };
/// 泛型类型为期待返回的类型
LoginResult result = await remote.SendAsyncSafeAwait<LoginResult>(login, (ex)=>{});
///后续代码 不用任何判断,也不用担心异常。
Console.WriteLine(result.IsSuccess);
}
```
### **多类型等待与模式匹配**
虽然不推荐一个请求对应多个回复类型,但是某些业务设计仍然有此需求。比如将所有errorcode作为一个独立类型回复,那么一个请求就有可能有对应回复和errorcode两个回复类型。
*protobuf协议中可以使用 `IMessage接口` 作为等待返回的类型。*
```cs
class ErrorCode{}
class Resp{}
class Req{}
async void Test(IRemote remote){
Req req = new Req();
///泛型中填写所有期待返回类型的基类,然后根据类型分别处理。
///如果泛型处仅使用一种类型,那么服务器回复另一种类型时,底层会转换为 InvalidCastException 进如异常处理逻辑。
var ret = await remote.SendAsyncSafeAwait<object>(req);
if(ret is ErrorCode ec)
{
}
else if(ret is Resp resp)
{
}
}
```
---
## 3. ``ValueTask<object> OnReceive(short cmd, int messageID, object message);``
接收端回调函数
```cs
protected virtual async ValueTask<object> OnReceive(short cmd, int messageID, object message)
{
switch (message)
{
case TestPacket1 packet1:
Console.WriteLine($"接收消息{nameof(TestPacket1)}--{packet1.Value}");
return null;
case Login login:
Console.WriteLine($"接收消息{nameof(Login)}--{login.Account}");
return new LoginResult { IsSuccess = true };
case TestPacket2 packet2:
return new TestPacket1 { Value = packet2.Value };
default:
break;
}
return null;
}
```
#### 注意: 异步发送方法等待的返回值虽然也是接收到的消息,但是会被分发到异步函数回调中,不会触发本函数。即使异步发送方法没有使用await关键字而导致异步后续没有注册,返回消息也不会触发本函数,返回消息将被忽略。 *(事实上,很难实现找不到异步后续时将消息分发到此函数中。因为不持有返回的Task引用时,想要将消息转送到本回调函数,需要对Task增加额外的标记,生命周期难以控制,控制流会变得更难以理解。详细情况参阅源码RpcCallbackPool.CreateCheckTimeout)*
---
## 4. 由发送端和消息协议控制的的响应机制
具体响应方式参考`PreReceive`函数源码,参考IPreReceiveable,ICmdOption,SendOption.Echo等。
没有合适的资源?快使用搜索试试~ 我知道了~
应用程序和游戏网络模块解决方案.zip
共328个文件
meta:96个
cs:87个
asset:27个
需积分: 3 0 下载量 41 浏览量
2024-01-15
10:41:16
上传
评论
收藏 5.42MB ZIP 举报
温馨提示
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
资源推荐
资源详情
资源评论
收起资源包目录
应用程序和游戏网络模块解决方案.zip (328个子文件)
Megumin.GameFramework.Net.asmdef 594B
Megumin.GameFramework.Net.Editor.asmdef 459B
LiberationSans SDF.asset 2.15MB
KaiTi_GB2312 SDF.asset 2.05MB
ProjectSettings.asset 21KB
EmojiOne.asset 13KB
InputManager.asset 10KB
LiberationSans SDF - Fallback.asset 9KB
QualitySettings.asset 6KB
Default Style Sheet.asset 5KB
GraphicsSettings.asset 2KB
Physics2DSettings.asset 2KB
TMP Settings.asset 2KB
NavMeshAreas.asset 1KB
DynamicsManager.asset 1KB
EditorSettings.asset 1KB
MemorySettings.asset 1KB
PackageManagerSettings.asset 963B
UnityConnectSettings.asset 901B
AudioManager.asset 413B
TagManager.asset 378B
VFXManager.asset 353B
EditorBuildSettings.asset 249B
TimeManager.asset 202B
VersionControlSettings.asset 188B
XRSettings.asset 158B
NetworkManager.asset 151B
PresetManager.asset 146B
ClusterInputManager.asset 114B
TMPro_Mobile.cginc 5KB
TMPro_Surface.cginc 3KB
TMPro_Properties.cginc 3KB
TMPro.cginc 2KB
UdpRemoteListener.cs 28KB
RemoteBase.cs 23KB
TcpTransport.cs 21KB
RpcCallbackPool.cs 20KB
SpanByteExtension.cs 18KB
MessageLUT.cs 16KB
UdpTransport.cs 16KB
OpTest.cs 15KB
PrimitiveObjectFormatter.cs 13KB
MessageThreadTransducer.cs 13KB
IRemote.cs 13KB
MainWindow.xaml.cs 13KB
UnitTestRemote.cs 12KB
TestMessage.cs 10KB
Program.cs 10KB
KcpTransport.cs 9KB
Program.cs 9KB
RpcLayer.cs 9KB
Program.cs 8KB
TcpDisconnector.cs 7KB
RpcRemote.cs 7KB
MiniTask.cs 7KB
TcpBufferWriter.cs 7KB
MiniTaskAwaiter.cs 6KB
UdpAuth.cs 6KB
RoutingInformationModifier.cs 6KB
Protobuf_netLUT.cs 6KB
TcpRemoteListener.cs 6KB
MainWindow.xaml.cs 5KB
MessagePackLUT.cs 5KB
NetworkInterfacInfo.cs 5KB
TimeStampSynchronization.cs 5KB
FormatterContainer.cs 5KB
ProtobufLUT.cs 5KB
RemotePool.cs 4KB
Utility.cs 4KB
ReConnector.cs 4KB
RpcRemoteOld.cs 4KB
Extension.cs 4KB
MSGIDAttribute.cs 3KB
KcpRemoteListener.cs 3KB
SocketCloser.cs 3KB
DCSContainer.cs 3KB
UnitTestMessage.cs 3KB
UnitTest1.cs 3KB
GetTime.cs 3KB
AutoGetIP.cs 3KB
PingTool.cs 2KB
RTT.cs 2KB
MainWindow.xaml.cs 2KB
QuicTransport.cs 2KB
Program.cs 2KB
Authentication.cs 2KB
UnitTestRemote2.cs 2KB
Heartbeat.cs 2KB
MessageLUTTests.cs 2KB
Program.cs 2KB
GateService.cs 2KB
Extension.cs 1KB
BufferWriterBytesStream.cs 1KB
DeserializeLengthHelper.cs 1KB
MessageLUTTestBuffer.cs 1KB
MessageHeader.cs 1KB
SendOption.cs 1KB
Program.cs 1KB
Program.cs 1KB
TargetIP.cs 1KB
共 328 条
- 1
- 2
- 3
- 4
资源评论
JJJ69
- 粉丝: 6003
- 资源: 5593
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功