Библиотека асинхронных сокетов на C#.
Для установки socket4net выполните следующую команду в консоли управления пакетами
PM > Install-Package socket4net
protobuf-net## Начало работы
// запуск лаунчера
var launcher = Obj.New<Launcher>(LauncherArg.Default, true);
// запуск сервера
var server = Obj.New<Server<ChatSession>>(new ServerArg(null, "127.0.0.1", 9527), true);
// остановка сервера
server.Destroy();
// остановка лаунчера
launcher.Destroy();
клиент такой же как и сервер
Все сообщения распределяются в DispatchableSession
, который имеет два абстрактных метода:
public abstract Task<NetResult> HandleRequest(IDataProtocol rq);
public abstract Task<bool> HandlePush(IDataProtocol ps);
Необходимо реализовать эти методы в вашем собственном сессионном объекте. например:
// для .net45
public class ChatSession : DispatchableSession
{
public override Task<bool> HandlePush(IDataProtocol ps)
{
var more = ps as DefaultDataProtocol;
// выполнение вашего собственного обработчика
return Task.FromResult(true);
}
public override Task<NetResult> HandleRequest(IDataProtocol rq)
{
var more = ps as DefaultDataProtocol;
// выполнение вашего собственного обработчика
return Task.FromResult(NetResult.Success);
}
}
// для .net35
public class ChatSession : DispatchableSession
{
public override void HandlePush(IDataProtocol ps, Action<bool> cb)
{
var more = ps as DefaultDataProtocol;
// выполнение вашего собственного обработчика
var result = true; /* ваш собственный результат обработки */
cb(result);
}
public override void HandleRequest(IDataProtocol rq, Action<NetResult> cb)
{
var more = ps as DefaultDataProtocol;
// выполнение вашего собственного обработчика
var result = NetResult.Success;
cb(result);
}
}
```Успех/* ваш собственный результат обработки */;
cb(результат);
}
}
```#### API запроса/推送
Запрос означает, что нам требуется получить ответ от удаленного узла, тогда как推送 просто сообщает удаленному узлу о произошедшем событии, не требуя ответа.<br>Таким образом, при выполнении запроса API используется обратный вызов, предоставленный (.NET 3.5) или асинхронный возврат типа `Task<NetResult>` (.NET 4.5). Обратный вызов или `Task<NetResult>` информируют отправителя о том, успешно ли выполнен запрос.
```C#
// многопоточная передача
void MultiCast<T>(T proto, IEnumerable<ISession> sessions) where T : IDataProtocol;
void Broadcast<T>(T proto) where T : IDataProtocol;
// запрос
Task<NetResult> RequestAsync<T>(T proto) where T : IDataProtocol;
void RequestAsync<T>(T proto, Action<bool, byte[]> cb) where T : IDataProtocol;
//推送
void Push<T>(T proto) where T : IDataProtocol;
Каждый протокол является экземпляром ProtoContact
из библиотеки protobuf-net, может быть также DefaultDataProtocol
из socket4net или любым пользовательским протоколом, реализующим интерфейс IDataProtocol
.
Например, стандартный протокол данных socket4net:
[ProtoContract]
public class DefaultDataProtocol : IDataProtocol
{
[ProtoMember(1)]
public short Ops { get; set; }
[ProtoMember(2)]
public byte[] Data { get; set; }
}
По умолчанию, socket4net не шифрует ваши преобразованные данные, но вы можете изменить это, предоставив пару методов шифрования/дешифрования в методе OnInit
вашего пользовательского сессионного объекта.
Например:
var key = Encoding.Default.GetBytes("12345678");
var des = DES.Create();
var encryptor = des.CreateEncryptor(key, key);
Encoder = bytes => encryptor.TransformFinalBlock(bytes, 0, bytes.Length);
``` var decryptor = des.CreateDecryptor(key, key);
Decoder = bytes => decryptor.TransformFinalBlock(bytes, 0, bytes.Length);
Группа QQ: http://jq.qq.com/?_wv=1027&k=VptNja
Электронная почта: lizs4ever@163.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )