Giter Site home page Giter Site logo

yswenli / saea Goto Github PK

View Code? Open in Web Editor NEW
415.0 36.0 128.0 59.45 MB

SAEA.Socket is a high-performance IOCP framework TCP based on dotnet standard 2.0; Src contains its application test scenarios, such as websocket,rpc, redis driver, MVC WebAPI, lightweight message server, ultra large file transmission, etc. SAEA.Socket是一个高性能IOCP框架的 TCP,基于dotnet standard 2.0;Src中含有其应用测试场景,例如websocket、rpc、redis驱动、MVC WebAPI、轻量级消息服务器、超大文件传输等

Home Page: http://www.cnblogs.com/yswenli/

License: Apache License 2.0

C# 98.19% HTML 0.59% CSS 0.08% JavaScript 1.14%
iocp websocket-client websockets webapi mvc high-performance rpc mvcwebapi socket mvc-webapi

saea's Introduction

Logo SAEA.Socket

NuGet version (SAEA) License

SAEA.Socket Is an IOCP high-performance sockets network framework, based on dotnet standard 2.0; SRC contains its use scenarios, such as large file transfer, websocket client and server, high-performance message queue, RPC, redis driver, httpserver, mqtt, MVC, DNS, message server, etc

SAEA.Socket是一个IOCP高性能sockets网络框架,基于dotnet standard 2.0;Src中含有其使用场景,例如大文件传输、websocket client and server、高性能消息队列、rpc、redis驱动、httpserver、MQTT、Mvc、DNS、消息服务器等

QQ群:788260487

  • [√] IOCP
  • [√] FileTransfer
  • [√] FTP
  • [√] MessageSocket
  • [√] QueueSocket
  • [√] MVC
  • [√] RPC
  • [√] Websocket
  • [√] RedisDrive
  • [√] MQTT
  • [√] DNS

Reference component

引用组件,可以在nuget中搜索saea,或者直接输入命令

Install-Package SAEA.Sockets -Version 6.0.0.2

nuget url: https://www.nuget.org/packages?q=saea


Example

SAEA.Sockets for custom protocol

JT808 protocol

The test project is SAEA. Sockets Test, which demonstrates how to extend IContext, IUnpacker decoding and encoding to access SAEA. Sockets by using tripartite protocol (JT808). 测试项目为SAEA.SocketsTest,其中演示了使用三方协议(JT808)来如何扩展IContext、IUnpacker解码、编码的方式接入SAEA.Sockets

FileTransfer

saea.filesocket usage

var fileTransfer = new FileTransfer(filePath);
fileTransfer.OnReceiveEnd += _fileTransfer_OnReceiveEnd;
fileTransfer.OnDisplay += _fileTransfer_OnDisplay;
fileTransfer.Start();
//send file
fileTransfer.SendFile(string fileName, string ip)

FTP

saea.ftp usage

saea.ftpclient

var client = new FTPClient(ip, port, username, pwd);
client.Ondisconnected += _client_Ondisconnected;
client.Connect();
var path = client.CurrentDir();
client.Upload(filePath, (o, c) =>
{
	size = c;
	_loadingUserControl.Message = $"正在上传文件:{fileName},{(o * 100 / c)}%";
});
client.Download(fileName, Path.Combine(filePath, fileName), (o, c) =>
{
	_loadingUserControl.Message = $"正在下载文件:{fileName}{(o * 100 / c)}%";
});

saea.ftpserver

_serverConfig.IP = ip;
_serverConfig.Port = port;
FTPServerConfigManager.Save();

var ftpServer = new FTPServer(_serverConfig.IP, _serverConfig.Port, _serverConfig.BufferSize);
ftpServer.OnLog += _ftpServer_OnLog;
ftpServer.Start();

QueueTest

saea.queue server usage

var server = new QServer();
server.Start();

saea.queue producer usage

var ipPort = "127.0.0.1:39654";
QClient producer = new QClient("productor_" + Guid.NewGuid().ToString("N"), ipPort);
producer.OnError += Producer_OnError;
producer.OnDisconnected += Client_OnDisconnected;
producer.Connect();
producer.Publish(topic, msg);

saea.queue consumer usage

var ipPort = "127.0.0.1:39654";
QClient consumer = new QClient("subscriber_" + Guid.NewGuid().ToString("N"), ipPort);
consumer.OnMessage += Subscriber_OnMessage;
consumer.OnDisconnected += Client_OnDisconnected;
consumer.Connect();
consumer.Subscribe(topic);

WebSocket

wsserver usage

WSServer server = new WSServer();
server.OnMessage += Server_OnMessage;
server.Start();

private static void Server_OnMessage(string id, WSProtocal data)
{
    Console.WriteLine("WSServer 收到{0}的消息:{1}", ConsoleColor.Green, id, Encoding.UTF8.GetString(data.Content));
    server.Reply(id, data);
}

wsclient usage

WSClient client = new WSClient();
client.OnPong += Client_OnPong;
client.OnMessage += Client_OnMessage;
client.OnError += Client_OnError;
client.OnDisconnected += Client_OnDisconnected;
client.Connect();
client.Send("hello world!");
client.Ping();
client.Close();

RedisTest

https://github.com/yswenli/WebRedisManager

saea.redis usage

 var cnnStr = "server=127.0.0.1:6379;passwords=yswenli";
 RedisClient redisClient = new RedisClient(cnnStr);
 redisClient.Connect();
 redisClient.GetDataBase(1).Set("key", "val");
 var val = redisClient.GetDataBase().Get("key");

SAEA.MVC

https://github.com/yswenli/SAEA.Rested

saea.mvc init usage

var mvcConfig = SAEAMvcApplicationConfigBuilder.Read();
SAEAMvcApplication mvcApplication = new SAEAMvcApplication(mvcConfig);
//设置默认控制器
mvcApplication.SetDefault("home", "index");
mvcApplication.SetDefault("index.html");
//限制
mvcApplication.SetForbiddenAccessList("/content/");
mvcApplication.SetForbiddenAccessList(".jpg");

mvcApplication.Start();

saea.mvc controller usage

[LogAtrribute]
public class HomeController : Controller
{          
	[Log2Atrribute]
	[HttpGet]
	[HttpPost]
	public ActionResult Index()
	{
		return Content("Hello,I'm SAEA.MVC!你好!");
	}
	
	public ActionResult Show()
	{
		var response = HttpContext.Response;
		response.ContentType = "text/html; charset=utf-8";
		response.Write("<h3>测试一下那个response对象使用情况!</h3>参考消息网4月12日报道外媒称,法国一架“幻影-2000”战机意外地对本国一家工厂投下了炸弹。据俄罗斯卫星网4月12日援引法国蓝色电视台报道,事故于当地时间10日发生在卢瓦尔省,当时两架法国空军的飞机飞过韦尔尼松河畔诺让市镇上空,一枚炸弹从其中一架飞机上掉了下来,直接掉在了佛吉亚公司的工厂里。与此同时,有两人受伤。一名目击者称,“起初是两架战机飞过,然后我们都听到了物体撞击的声音,声音相当响,甚至盖过了飞过的飞机的噪音。”法国空军代表称,掉在工厂里的炸弹是演习用的,里面没有装炸药,本来是要将它投到离兰斯市不远的靶场。这名代表称事件“非常非常罕见”,目前正进行调查。");
		response.End();
		return Empty();
	}
	
	public ActionResult GetModels(string version, BasePamars basePamars, PagedPamars pagedPamars)
	{
		return Content($"version:{version}  basePamars:{Serialize(basePamars)}  pagedPamars:{Serialize(pagedPamars)}");
	}	
	
	public ActionResult Download()
	{
		return File(HttpContext.Server.MapPath("/Content/Image/c984b2fb80aeca7b15eda8c004f2e0d4.jpg"));
	}

	[HttpPost]
	public ActionResult Upload(string name)
	{
		var postFiles = HttpContext.Request.PostFiles;
		return Content($"ok!name:{name}");
	}
}

SAEA.RPC

saea.rpc service usage

var sp = new ServiceProvider();
sp.OnErr += Sp_OnErr;
sp.Start();

[RPCService]
public class HelloService
{
	public string Hello()
	{
		return "saea.rpc hello!"
	}
}

saea.rpc client usage

var url = "rpc://127.0.0.1:39654";
RPCServiceProxy cp = new RPCServiceProxy(url);
cp.OnErr += Cp_OnErr;
cp.HelloService.Hello();

SAEA.Message

saea.message server usage

MessageServer server = new MessageServer(1024, 1000 * 1000, 30 * 60 * 1000);

server.OnDisconnected += Server_OnDisconnected;

server.Start();

saea.message client usage

var cc1 = new MessageClient();
cc1.OnPrivateMessage += Client_OnPrivateMessage;
cc1.Connect();

//私信
cc1.SendPrivateMsg(cc2.UserToken.ID, "你好呀,cc2!");

//订阅
cc1.Subscribe(channelName);

//发送频道消息
cc1.SendChannelMsg(channelName, "hello!");

//创建群组
cc1.SendCreateGroup(groupName);

//加入群组
cc2.SendAddMember(groupName);


//发送群消息
cc1.SendGroupMessage(groupName, "群主广播了!");

//退群
cc2.SendRemoveGroup(groupName);

SAEA.MQTT

saea.mqtt server usage

var serverOptions = new MqttServerOptionsBuilder().Build();

server.ApplicationMessageReceived += Server_ApplicationMessageReceived;

await server.StartAsync(serverOptions)

private static void Server_ApplicationMessageReceived(object sender, MQTT.Event.MqttMessageReceivedEventArgs e)
{
    Console.ForegroundColor = ConsoleColor.DarkGreen;

    Console.WriteLine($"Server收到消息,ClientId:{e.ClientId}{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
}

saea.mqtt client usage

var client = factory.CreateMqttClient();

var clientOptions = new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1").Build();

client.ApplicationMessageReceived += Client_ApplicationMessageReceived;

await client.ConnectAsync(clientOptions);

client.SubscribeAsync("test/topic").GetAwaiter().GetResult();

client.PublishAsync("test/topic", "hello").GetAwaiter().GetResult();


private static void Client_ApplicationMessageReceived(object sender, MQTT.Event.MqttMessageReceivedEventArgs e)
{
    Console.ForegroundColor = ConsoleColor.Red;
	
    Console.WriteLine($"client:{e.ClientId}收到消息:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
}

Instance screenshot










More

WebRedisManager也是基于此的一款redis管理工具,具体可参见:https://www.cnblogs.com/yswenli/p/9460527.html git源码:https://github.com/yswenli/WebRedisManager

GFF一款仿QQ通信程序同样基于此,具体可参见:https://github.com/yswenli/GFF

saea's People

Contributors

nwilliamfeng avatar yswenli avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

saea's Issues

MessageClient的Subscribe与Unsubscribe方法返回错误的状态

与MessageServer对象同一个程序集的MessageClient对象在第一次调用Subscribe方式会返回false,之后再多次调用会返回true.
与MessageServer对象不在同一个程序集的MessageClient对象无论如何调用Subscribe返回的都是false,但可以接受到消息.
Unsubscribe也会出现上述的情况.

FTP 例子代码不完整

FTP 例子代码不完整,
var ftpServer = new FTPServer("192.168.31.172", 9200);
ftpServer.OnLog += FtpServer_OnLog;
ftpServer.Start();
无法启用FTP

用SAEA.MQTT时,启动阶段报错,等待一段时间重试才行

你好,我每次启动程序都会报一大堆错,但是等一会儿又能连上MQTT broker。我写了一段这样的代码:

private static SAEA.MQTT.MqttFactory _factory = new SAEA.MQTT.MqttFactory();
private SAEA.MQTT.Interface.IMqttClient _client = null;
_client = _factory.CreateMqttClient();
var clientOptions = new SAEA.MQTT.MqttClientOptionsBuilder()
                .WithTcpServer(addr, port)
                .WithKeepAliveSendInterval(TimeSpan.FromSeconds(3))
                .Build();
await _client.ConnectAsync(clientOptions);

我在使用connectAsync时,报错如下所示:
Value cannot be null.

Parameter name: key
at System.Collections.Concurrent.ConcurrentDictionary2[TKey,TValue].ThrowKeyNullException () [0x00000] in <ac823e2bb42b41bda67924a45a0173c3>:0 at System.Collections.Concurrent.ConcurrentDictionary2[TKey,TValue].TryGetValue (TKey key, TValue& value) [0x00008] in :0
at SAEA.Sockets.Core.ChannelManager.Refresh (System.String id) [0x00001] in <1f32d9392e8b4e14a2f782e16ae66880>:0
at SAEA.MQTT.Core.Implementations.MqttTcpChannel.WriteAsync (System.Byte[] buffer, System.Int32 offset, System.Int32 count, System.Threading.CancellationToken cancellationToken) [0x00011] in :0
at SAEA.MQTT.Core.Implementations.MqttChannelAdapter+d__22.MoveNext () [0x000e5] in :0

我安装的相关依赖:
Newtonsoft.Json.12.0.3/
Pipelines.Sockets.Unofficial.2.1.0/
SAEA.Common.5.3.2/
SAEA.MQTT.5.3.2/
SAEA.Sockets.5.3.2/
System.Buffers.4.5.0/
System.IO.Pipelines.4.6.0/
System.Memory.4.5.3/
System.Runtime.CompilerServices.Unsafe.4.6.0/
System.Threading.Tasks.Extensions.4.5.2/
protobuf-net.2.4.4/

编译报错 请问如何解决

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.WebSocket\bin\Debug\netstandard2.0\SAEA.WebSocket.dll” SAEA.WebSocketTest D:\GitHub\SAEA-master\Src\SAEA.WebSocketTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.DNSTest D:\GitHub\SAEA-master\Src\SAEA.DNSTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.FileTest D:\GitHub\SAEA-master\Src\SAEA.FileTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.HttpTest D:\GitHub\SAEA-master\Src\SAEA.HttpTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.MQTTTest D:\GitHub\SAEA-master\Src\SAEA.MQTTTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.MVCTest D:\GitHub\SAEA-master\Src\SAEA.MVCTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.MessageTest D:\GitHub\SAEA-master\Src\SAEA.MessageTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.QueueSocketTest D:\GitHub\SAEA-master\Src\SAEA.QueueSocketTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.RPCTest D:\GitHub\SAEA-master\Src\SAEA.RPCTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.RedisSocketTest D:\GitHub\SAEA-master\Src\SAEA.RedisSocketTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Sockets\bin\Debug\netstandard2.0\SAEA.Sockets.dll” SAEA.WebSocketTest D:\GitHub\SAEA-master\Src\SAEA.WebSocketTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.RPC\bin\Debug\netstandard2.0\SAEA.RPC.dll” SAEA.RPCTest D:\GitHub\SAEA-master\Src\SAEA.RPCTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.RedisSocket\bin\Debug\netstandard2.0\SAEA.RedisSocket.dll” SAEA.RedisSocketTest D:\GitHub\SAEA-master\Src\SAEA.RedisSocketTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.QueueSocket\bin\Debug\netstandard2.0\SAEA.QueueSocket.dll” SAEA.QueueSocketTest D:\GitHub\SAEA-master\Src\SAEA.QueueSocketTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.MVC\bin\Debug\netstandard2.0\SAEA.MVC.dll” SAEA.MVCTest D:\GitHub\SAEA-master\Src\SAEA.MVCTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.MQTT\bin\Debug\netstandard2.0\SAEA.MQTT.dll” SAEA.MQTTTest D:\GitHub\SAEA-master\Src\SAEA.MQTTTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.MessageSocket\bin\Debug\netstandard2.0\SAEA.MessageSocket.dll” SAEA.MessageTest D:\GitHub\SAEA-master\Src\SAEA.MessageTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Http\bin\Debug\netstandard2.0\SAEA.Http.dll” SAEA.HttpTest D:\GitHub\SAEA-master\Src\SAEA.HttpTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Http\bin\Debug\netstandard2.0\SAEA.Http.dll” SAEA.MVCTest D:\GitHub\SAEA-master\Src\SAEA.MVCTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.FileSocket\bin\Debug\netstandard2.0\SAEA.FileSocket.dll” SAEA.FileTest D:\GitHub\SAEA-master\Src\SAEA.FileTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.DNS\bin\Debug\netstandard2.0\SAEA.DNS.dll” SAEA.DNSTest D:\GitHub\SAEA-master\Src\SAEA.DNSTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Common\bin\Debug\netstandard2.0\SAEA.Common.dll” SAEA.DNSTest D:\GitHub\SAEA-master\Src\SAEA.DNSTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Common\bin\Debug\netstandard2.0\SAEA.Common.dll” SAEA.FileTest D:\GitHub\SAEA-master\Src\SAEA.FileTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Common\bin\Debug\netstandard2.0\SAEA.Common.dll” SAEA.HttpTest D:\GitHub\SAEA-master\Src\SAEA.HttpTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Common\bin\Debug\netstandard2.0\SAEA.Common.dll” SAEA.MQTTTest D:\GitHub\SAEA-master\Src\SAEA.MQTTTest\CSC 1 活动
错误 CS0006 未能找到元数据文件“D:\GitHub\SAEA-master\Src\SAEA.Common\bin\Debug\netstandard2.0\SAEA.Common.dll” SAEA.MVCTest D:\GitHub\SAEA-master\Src\SAEA.MVCTest\CSC 1 活动


偶发性异常

说明: 由于未经处理的异常,进程终止。
异常信息: System.NullReferenceException
在 SAEA.Sockets.Core.Tcp.IocpServerSocket.ProcessSended(System.Net.Sockets.SocketAsyncEventArgs)
在 SAEA.Sockets.Core.Tcp.IocpServerSocket.IO_Completed(System.Object, System.Net.Sockets.SocketAsyncEventArgs)
在 System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(System.Net.Sockets.SocketAsyncEventArgs)
在 System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(System.Object)
在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
在 System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(System.Net.Sockets.SocketError, Int32, System.Net.Sockets.SocketFlags)
在 System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

网络状况不佳的情况下偶发性出现此异常,无法在我自己的代码中拦截这个异常,从而会导致程序崩溃

socket 接收报文问题请教

IO 端口完成后,回调 IO_Completed 进行报文的接收处理,此时的上下文环境,是不是可能存在每个报文的线程是不同的?
如果是这样的话,递交给应用的报文是不是就会在不同的线程中?

谢谢

IocpClientSocket.ConnectAsync 当连接不上,callBack 没有执行!

你好,
当连接不上,callBack 没有执行!
SAEA.Sockets.Core.Tcp.IocpClientSocket.ConnectAsync(Action callBack = null)

可否把 void ProcessConnected(SocketAsyncEventArgs e) 里调用
_connectCallBack?.Invoke(e.SocketError);
移到 if(Connected) 外去。这里造成只在 Connected 才会调用 callBack。

ContextFactory Cache Error

  1. Setting Websocker server max count = 2 and cache = true
  2. When Client 1 and Client 2 connect to server => Everything Work.
  3. After Client 1 and Client 2 disconnected from server.
  4. Client 3, 4, 5 try to connect to server => Everything Failed.

Maybe UserToken cannot reuse from ContextFactory. because when i setting cache = false => Result is work good.

能够在VS2015上面运行?

试了下确实不能在VS2015直接运行,应该是.net版本太低,但是我修改了部分语法,部分TCP连接方法由异步改成了同步,不知道行不行。

如何与Netty一起工作?

例如:
在Linux 上的netty 作为服务端
Windows客户端选用这个库作为通信手段
但是我看到的示例里都是自己把服务端和客户端的活都干了。
我不确定这个库是否能和其他库完美协作,
请问您有没有测试或者考虑过我上面说到的情况?

关于 SocketAsyncEventArgs 为什么要单独设计一个池子?

userToken已经有个池子了,为什么不直接给usertoken初始化一个读的SocketAsyncEventArgs和写的SocketAsyncEventArgs对象,而要单独用个 SocketAsyncEventArgsPool,也没看到哪里单独需要取SocketAsyncEventArgs 而不经过userToken,设计一个池子是不是多此一举?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.