DotNettySocket — это кросс-платформенный фреймворк для работы с сокетами на платформе .NET (поддерживает .NET4.5+ и .NET Standard2.0+), который поддерживает TcpSocket, WebSocket и UdpSocket. Фреймворк основан на мощном DotNetty от Microsoft и стремится обеспечить простоту, эффективность и элегантность работы с сокетами.
Способ установки: установка через Nuget DotNettySocket
Адрес проекта: https://github.com/Coldairarrow/DotNettySocket# Обстоятельства появления Два года назад, когда я впервые столкнулся с Интернетом вещей, мне требовались TCP и UDP для связи. Чтобы облегчить использование, я создал простое обертывание для исходных сокетов, что удовлетворило основные требования. Затем я открыл этот фреймворк для общественности. Однако из-за ограниченных возможностей и времени, я не смог оптимизировать его дальше. Позже я обнаружил мощный DotNetty, который является открытым исходным кодом от команды Microsoft Azure, основан на Java Netty и имеет отличные характеристики и мощную команду поддержки. DotNetty очень мощен, но его использование не всегда простое (может быть, это мое личное мнение). В последнее время проект требовал WebSocket, поэтому я нашел время, чтобы создать простое обертывание на основе DotNetty, и создал фреймворк, который стремится быть простым, эффективным и элегантным.# Способы использования## TcpSocket Tcp — это протокол передачи данных, поэтому управление соединениями на стороне сервера является ключевым моментом. Фреймворк поддерживает обработку различных событий, установку идентификатора соединения, поиск определенного соединения по имени, отправку и получение данных, разделение пакетов и обработку прилипания пакетов.
using Coldairarrow.DotNettySocket;
using System;
using System.Text;
using System.Threading.Tasks;
using System;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)}");
})
.```csharp
OnServerStarted(server =>
{
Console.WriteLine($"Сервер запущен");
}).BuildAsync();
}
}
}```md
## WebSocket
WebSocket интерфейс аналогичен TcpSocket, за исключением того, что TcpSocket поддерживает отправку и получение байтов, а также требует ручной обработки фрагментации и слияния пакетов. В то время как WebSocket работает с строками (кодировка UTF-8) без необходимости учитывать фрагментацию и слияние пакетов. В текущей версии фреймворка не поддерживается WSS, рекомендуется использовать Nginx для перенаправления (документация легко доступна в интернете).
- Сервер
```csharp
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) =>
{
``````markdown
## Клиентская консоль
```c#
using Coldairarrow.DotNettySocket;
using System;
using System.Threading.Tasks;
namespace Coldairarrow.DotNettySocket
{
public class ClientConsole
{
public async Task RunAsync()
{
var builder = new ServerBuilder();
builder
.OnConnectionEstablished(connection =>
{
Console.WriteLine($"Отправка данных соединению с именем [{connection.ConnectionName}]: {msg}");
})
.OnServerStarted(server =>
{
Console.WriteLine($"Сервер запущен");
})
.BuildAsync();
}
}
}
```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}");
})
.OnReceive((client, msg) =>
{
Console.WriteLine($"Клиент: полученное сообщение: {msg}");
})
.OnSend((client, msg) =>
{
Console.WriteLine($"Клиент: отправленное сообщение: {msg}");
})
.BuildAsync();
while (true)
{
await theClient.Send(Guid.NewGuid().ToString());
await Task.Delay(1000);
}
}
}
}
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script type="text/javascript">
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 {
console.log('Ваш браузер не поддерживает WebSocket');
}
}
</script>
</head>
<body onload="WebSocketTest()">
</body>
</html>
``` else {
alert("Ваш браузер не поддерживает WebSocket!");
}
}
</script>
```</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">Запустить WebSocket</a>
</div>
</body>
</html>
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($"Server closed");
})
.OnException(ex =>
{
Console.WriteLine($"Server error:{ex.Message}");
})
.OnRecieve((server, point, bytes) =>
{
Console.WriteLine($"Server: received message from [{point.ToString()}]:{Encoding.UTF8.GetString(bytes)}");
server.Send(bytes, point);
})
.OnSend((server, point, bytes) =>
{
Console.WriteLine($"Server sent data: target [{point.ToString()}]:{Encoding.UTF8.GetString(bytes)}");
})
.OnStarted(server =>
{
Console.WriteLine($"Server started");
}).BuildAsync();
Console.ReadLine();
}
}
}```c#
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);
}
}
}
}
Все приведенные выше примеры находятся в исходном коде. Если вам понравилось, пожалуйста, поставьте лайк и звезды. Надеюсь, это поможет вам.
Если у вас возникли какие-либо вопросы, пожалуйста, сообщите об этом или присоединяйтесь к группе для обсуждения.
QQ-группа 1: (полна)
QQ-группа 2: 579202910
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )