シンプルで実用的なSocketフレームワークDotNettySocket
11523 ワード
目次
概要
DotNettySocketは1つです.NETはプラットフォームにまたがるSocketフレームワーク(.NET 4.5+、.NET Standard 2.0+)をサポートするとともに、TcpSocket、WebSocket、UdpSocketをサポートし、マイクロソフトの強力なDotNettyフレームワークに基づいて、Socket通信に簡単で、効率的で、優雅な操作方式を提供することを追求している.
インストール方法:Nuget DotNettySocketをインストールすればよい
プロジェクトのアドレス:https://github.com/Coldairarrow/DotNettySocket
背景を生成
2年前に最初に接触物がネットワークに接続された時、TcpとUdp通信が必要で、使いやすいように元のSocketを簡単にパッケージ化し、基本的に需要を満たし、フレームワークをオープンソースにしました.しかし、精力と実力が限られているため、元の枠組みをさらに最適化することはできなかった.その後、強力なDotNettyフレームワークが発見され、DotNettyはマイクロソフトAzureチームのオープンソースJava Nettyフレームワークに基づく移植版であり、その性能が優れ、メンテナンスチームが強く、多くのものがある.NETの強力なフレームワークはすべてそれを使用します.DotNettyは機能が強いが、使い心地がまだ簡潔ではない(個人的な感覚かもしれない)ため、最近のプロジェクトではWebSocketが必要になっているため、私は時間を割いてDotNettyに基づいて簡単なパッケージを行い、簡単で効率的で優雅なSocketフレームワークを作り出した.
使用方法
TcpSocket
Tcpは接続向けであるため、サービス側は接続の管理が重要であり、フレームワークは各種イベントの処理をサポートし、接続に接続名(アイデンティティ識別)を設定し、接続名を通じて特定の接続を見つけ、接続を通じてデータを送受信し、パケットを分割し、パケットを貼り付ける処理をサポートする.
using Coldairarrow.DotNettySocket;
using System;
using System.Text;
using System.Threading.Tasks;
namespace TcpSocket.Server
{
class Program
{
static async Task Main(string[] args)
{
var theServer = await SocketBuilderFactory.GetTcpSocketServerBuilder(6001)
.SetLengthFieldEncoder(2)
.SetLengthFieldDecoder(ushort.MaxValue, 0, 2, 0, 2)
.OnConnectionClose((server, connection) =>
{
Console.WriteLine($" , [{connection.ConnectionName}], :{server.GetConnectionCount()}");
})
.OnException(ex =>
{
Console.WriteLine($" :{ex.Message}");
})
.OnNewConnection((server, connection) =>
{
connection.ConnectionName = $" {connection.ConnectionId}";
Console.WriteLine($" :{connection.ConnectionName}, :{server.GetConnectionCount()}");
})
.OnRecieve((server, connection, bytes) =>
{
Console.WriteLine($" : {Encoding.UTF8.GetString(bytes)}");
connection.Send(bytes);
})
.OnSend((server, connection, bytes) =>
{
Console.WriteLine($" [{connection.ConnectionName}] :{Encoding.UTF8.GetString(bytes)}");
})
.OnServerStarted(server =>
{
Console.WriteLine($" ");
}).BuildAsync();
Console.ReadLine();
}
}
}
using Coldairarrow.DotNettySocket;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace UdpSocket.Client
{
class Program
{
static async Task Main(string[] args)
{
var theClient = await SocketBuilderFactory.GetUdpSocketBuilder()
.OnClose(server =>
{
Console.WriteLine($" ");
})
.OnException(ex =>
{
Console.WriteLine($" :{ex.Message}");
})
.OnRecieve((server, point, bytes) =>
{
Console.WriteLine($" : [{point.ToString()}] :{Encoding.UTF8.GetString(bytes)}");
})
.OnSend((server, point, bytes) =>
{
Console.WriteLine($" : [{point.ToString()}] :{Encoding.UTF8.GetString(bytes)}");
})
.OnStarted(server =>
{
Console.WriteLine($" ");
}).BuildAsync();
while (true)
{
await theClient.Send(Guid.NewGuid().ToString(), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6003));
await Task.Delay(1000);
}
}
}
}
WebSocket
WebSocketはTcpSocketインタフェースとほぼ一致しており、TcpSocketはバイトの送受信をサポートし、パケット接着パケットを自分で処理する必要があるという違いしかありません.一方、WebSocketは文字列(UTF-8)を直接送受信し、パケット接着を考慮する必要はありません.フレームワークは現在WSSをサポートしていません.推奨ソリューションはNginxを使用して転送すればいいです(関連資料は検索すればあります)
using Coldairarrow.DotNettySocket;
using System;
using System.Threading.Tasks;
namespace WebSocket.Server
{
class Program
{
static async Task Main(string[] args)
{
var theServer = await SocketBuilderFactory.GetWebSocketServerBuilder(6002)
.OnConnectionClose((server, connection) =>
{
Console.WriteLine($" , [{connection.ConnectionName}], :{server.GetConnectionCount()}");
})
.OnException(ex =>
{
Console.WriteLine($" :{ex.Message}");
})
.OnNewConnection((server, connection) =>
{
connection.ConnectionName = $" {connection.ConnectionId}";
Console.WriteLine($" :{connection.ConnectionName}, :{server.GetConnectionCount()}");
})
.OnRecieve((server, connection, msg) =>
{
Console.WriteLine($" : {msg}");
connection.Send(msg);
})
.OnSend((server, connection, msg) =>
{
Console.WriteLine($" [{connection.ConnectionName}] :{msg}");
})
.OnServerStarted(server =>
{
Console.WriteLine($" ");
}).BuildAsync();
Console.ReadLine();
}
}
}
using Coldairarrow.DotNettySocket;
using System;
using System.Threading.Tasks;
namespace WebSocket.ConsoleClient
{
class Program
{
static async Task Main(string[] args)
{
var theClient = await SocketBuilderFactory.GetWebSocketClientBuilder("127.0.0.1", 6002)
.OnClientStarted(client =>
{
Console.WriteLine($" ");
})
.OnClientClose(client =>
{
Console.WriteLine($" ");
})
.OnException(ex =>
{
Console.WriteLine($" :{ex.Message}");
})
.OnRecieve((client, msg) =>
{
Console.WriteLine($" : :{msg}");
})
.OnSend((client, msg) =>
{
Console.WriteLine($" : :{msg}");
})
.BuildAsync();
while (true)
{
await theClient.Send(Guid.NewGuid().ToString());
await Task.Delay(1000);
}
}
}
}
(runoob.com)
function WebSocketTest() {
if ("WebSocket" in window) {
var ws = new WebSocket("ws://127.0.0.1:6002");
ws.onopen = function () {
console.log(' ');
setInterval(function () {
ws.send("111111");
}, 1000);
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
console.log(' ' + received_msg);
};
ws.onclose = function () {
console.log(" ...");
};
}
else {
alert(" WebSocket!");
}
}
UdpSocket
Udpは生まれながらにして送受信一体であり,以下,サービス側とクライアントに分けて理解を容易にするためだけである.
using Coldairarrow.DotNettySocket;
using System;
using System.Text;
using System.Threading.Tasks;
namespace UdpSocket.Server
{
class Program
{
static async Task Main(string[] args)
{
var theServer = await SocketBuilderFactory.GetUdpSocketBuilder(6003)
.OnClose(server =>
{
Console.WriteLine($" ");
})
.OnException(ex =>
{
Console.WriteLine($" :{ex.Message}");
})
.OnRecieve((server, point, bytes) =>
{
Console.WriteLine($" : [{point.ToString()}] :{Encoding.UTF8.GetString(bytes)}");
server.Send(bytes, point);
})
.OnSend((server, point, bytes) =>
{
Console.WriteLine($" : [{point.ToString()}] :{Encoding.UTF8.GetString(bytes)}");
})
.OnStarted(server =>
{
Console.WriteLine($" ");
}).BuildAsync();
Console.ReadLine();
}
}
}
using Coldairarrow.DotNettySocket;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace UdpSocket.Client
{
class Program
{
static async Task Main(string[] args)
{
var theClient = await SocketBuilderFactory.GetUdpSocketBuilder()
.OnClose(server =>
{
Console.WriteLine($" ");
})
.OnException(ex =>
{
Console.WriteLine($" :{ex.Message}");
})
.OnRecieve((server, point, bytes) =>
{
Console.WriteLine($" : [{point.ToString()}] :{Encoding.UTF8.GetString(bytes)}");
})
.OnSend((server, point, bytes) =>
{
Console.WriteLine($" : [{point.ToString()}] :{Encoding.UTF8.GetString(bytes)}");
})
.OnStarted(server =>
{
Console.WriteLine($" ");
}).BuildAsync();
while (true)
{
await theClient.Send(Guid.NewGuid().ToString(), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6003));
await Task.Delay(1000);
}
}
}
}
の最後の部分
以上の例はすべてソースコードにありますが、いいと思ったら「いいね星」をクリックして、皆さんの助けになってほしいです.
何か問題があったら、すぐにフィードバックしたり、グループを追加したりしてください.
Q群1:(満タン)
QQ群2:579202910