feat:初始化工程
This commit is contained in:
203
.gitignore
vendored
Normal file
203
.gitignore
vendored
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017/2019/2022 cache/options directory
|
||||||
|
.vs/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.tlog
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings.
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
|
||||||
|
# .NET Core SDK
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# Windows Installer files from build outputs
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
25
SocketHub.sln
Normal file
25
SocketHub.sln
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.13.35818.85
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHub", "SocketHub\SocketHub.csproj", "{802FB65F-272C-4C6F-AF31-19881EF58FEC}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{802FB65F-272C-4C6F-AF31-19881EF58FEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{802FB65F-272C-4C6F-AF31-19881EF58FEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{802FB65F-272C-4C6F-AF31-19881EF58FEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{802FB65F-272C-4C6F-AF31-19881EF58FEC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {41885D59-8EAD-4685-8B0C-E90596F00A49}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
139
SocketHub/Program.cs
Normal file
139
SocketHub/Program.cs
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
using System.Buffers;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using SuperSocket.ProtoBase;
|
||||||
|
using SuperSocket.Server;
|
||||||
|
using SuperSocket.Server.Abstractions;
|
||||||
|
using SuperSocket.Server.Host;
|
||||||
|
using SuperSocket.WebSocket.Server;
|
||||||
|
|
||||||
|
var host = Host.CreateDefaultBuilder(args)
|
||||||
|
.ConfigureServices((context, services) =>
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.AsMultipleServerHostBuilder()
|
||||||
|
.AddServer<TcpService, ProtocolFrame, BinaryPipelineFilter>(builder =>
|
||||||
|
{
|
||||||
|
builder
|
||||||
|
.UsePackageHandler(async (session, package) =>
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Magic={package.Magic:X4}, Type={package.Type}, Len={package.Length}");
|
||||||
|
await session.SendAsync(package.Payload);
|
||||||
|
})
|
||||||
|
.ConfigureServerOptions((ctx, config) =>
|
||||||
|
{
|
||||||
|
return config.GetSection("TcpServer");
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.AddWebSocketServer(builder =>
|
||||||
|
{
|
||||||
|
builder
|
||||||
|
.UseWebSocketMessageHandler(async (session, package) =>
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[WebSocket] ${package.Message}");
|
||||||
|
await session.SendAsync("ok");
|
||||||
|
})
|
||||||
|
.ConfigureServerOptions((ctx, config) =>
|
||||||
|
{
|
||||||
|
return config.GetSection("WebSocketServer");
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
await host.RunAsync();
|
||||||
|
|
||||||
|
public class TcpService : SuperSocketService<ProtocolFrame>
|
||||||
|
{
|
||||||
|
public TcpService(IServiceProvider serviceProvider, IOptions<ServerOptions> serverOptions)
|
||||||
|
: base(serviceProvider, serverOptions)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 协议数据结构
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Magic">帧头标识</param>
|
||||||
|
/// <param name="Length">数据长度</param>
|
||||||
|
/// <param name="Type">数据类型</param>
|
||||||
|
/// <param name="Payload">数据内容</param>
|
||||||
|
///
|
||||||
|
public record ProtocolFrame(
|
||||||
|
ushort Magic,
|
||||||
|
ushort Length,
|
||||||
|
ushort Type,
|
||||||
|
byte[] Payload
|
||||||
|
);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 二进制解析器: 把 TCP 字节流 → 拆包 → 转成 ProtocolFrame
|
||||||
|
/// </summary>
|
||||||
|
public class BinaryPipelineFilter : FixedHeaderPipelineFilter<ProtocolFrame>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 固定头长度
|
||||||
|
/// </summary>
|
||||||
|
public BinaryPipelineFilter() : base(6)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 从包头中解析出 Body 长度
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buffer">字节流</param>
|
||||||
|
/// <returns>Body 长度</returns>
|
||||||
|
protected override int GetBodyLengthFromHeader(ref ReadOnlySequence<byte> buffer)
|
||||||
|
{
|
||||||
|
var reader = new SequenceReader<byte>(buffer);
|
||||||
|
|
||||||
|
// 读取前2字节 → magic
|
||||||
|
reader.TryReadBigEndian(out ushort magic);
|
||||||
|
|
||||||
|
// 再读2字节 → Length
|
||||||
|
reader.TryReadBigEndian(out ushort length);
|
||||||
|
|
||||||
|
// 再读2字节 → Type
|
||||||
|
reader.TryReadBigEndian(out ushort type);
|
||||||
|
|
||||||
|
// 校验帧头
|
||||||
|
if (magic != 0x656D)
|
||||||
|
{
|
||||||
|
throw new Exception("非法帧头");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 限制长度
|
||||||
|
if (length == 0 || length > 8192)
|
||||||
|
{
|
||||||
|
throw new Exception("非法长度");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回 Payload 长度
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 把完整字节包 → 转换成 ProtocolFrame
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buffer">字节流</param>
|
||||||
|
/// <returns>ProtocolFrame</returns>
|
||||||
|
protected override ProtocolFrame DecodePackage(ref ReadOnlySequence<byte> buffer)
|
||||||
|
{
|
||||||
|
var reader = new SequenceReader<byte>(buffer);
|
||||||
|
|
||||||
|
// 读取前2字节 → magic
|
||||||
|
reader.TryReadBigEndian(out ushort magic);
|
||||||
|
|
||||||
|
// 再读2字节 → Length
|
||||||
|
reader.TryReadBigEndian(out ushort length);
|
||||||
|
|
||||||
|
// 再读2字节 → Type
|
||||||
|
reader.TryReadBigEndian(out ushort type);
|
||||||
|
|
||||||
|
var payload = buffer.Slice(6, length).ToArray();
|
||||||
|
|
||||||
|
// 构造ProtocolFrame
|
||||||
|
return new ProtocolFrame(magic, length, type, payload);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
SocketHub/SocketHub.csproj
Normal file
22
SocketHub/SocketHub.csproj
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="SuperSocket" Version="2.0.2" />
|
||||||
|
<PackageReference Include="SuperSocket.WebSocket" Version="2.1.0" />
|
||||||
|
<PackageReference Include="SuperSocket.WebSocket.Server" Version="2.1.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="appsettings.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
22
SocketHub/appsettings.json
Normal file
22
SocketHub/appsettings.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"serverOptions": {
|
||||||
|
"TcpServer": {
|
||||||
|
"name": "TcpServer",
|
||||||
|
"listeners": [
|
||||||
|
{
|
||||||
|
"ip": "Any",
|
||||||
|
"port": 4040
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"WebSocketServer": {
|
||||||
|
"name": "WebSocket",
|
||||||
|
"listeners": [
|
||||||
|
{
|
||||||
|
"ip": "Any",
|
||||||
|
"port": 5050
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user