-
Notifications
You must be signed in to change notification settings - Fork 44
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
是不是对于ConnectionHandler,虽然底层是websocket,但是只能当成是流? #3
Comments
如果你想让流量基于websocket传输,那不能直接在kestrel层使用YourConnectionHandler,而应该在asp.net层的websocket路由里使用YourConnectionHandler,此时会表现出以下现象: 1、ConnectionContext里面的ITransferFormatFeature.ActiveFormat默认为TransferFormat.Text,你可以根据实际是否修改为TransferFormat.Binary; app.MapConnectionHandler<YourConnectionHandler>("/xxx_over_websocket", options =>
{
options.WebSockets.SubProtocolSelector = ...
}); |
你可以把websocket帧理解为tcp帧,websocket帧里的payload理解为tcp帧的payload,多个websocket帧的payload串起来,就是websocket流,与tcp流是一个意思。 |
其实我不想说帧,你的文档里写了帧所以我用了帧。我想说的是packet或message(因为js的WebSocket是onmessage和message事件)。 我好奇的是ConnectionHandler既然没能暴露出WebSocket所有功能,难道是为了它的底层还能替换成tcp?但是替换成tcp,明显 我也不能理解 这种高级的功能都封装起来了,服务器容易写了,反正不用关心底层到底怎么传输的。但是,还是要写通信的另一端的啊。 |
首先我们了解网络数据包,其实是分层的,比如http over tls over tcp over ip(v4 or v6),就是我们常见的https,http over tcp over ip,是我们常见的http。在web框架里,其实我们也不关系 http over 啥,只关心如果解析http和响应http。 同理,kestrel的中使用中间件来处理这些分层,往往一层就是一个中间件,而不是一个中间件就干完所有层的活。ConnectionHandler是最后一个中间件,如果是处理http,则对应aps.netcore的WebApplcation概念。 假设我们自定义了 hxxp 协议,同时已经实现了HxxpConnectionHandler来处理这个协议,在使用不同的传输层来传输hxxp,会有不同的处理方式: hxxp over tcp hxxp over websocket over tcp
关于Websocket中间件,我们可以自己实现,也可以直接使用asp.netcore层已实现的websocket hxxp over websocket over tls over tcp
上些这些例子,可以很好的证明,使用分层机制,HxxpConnectionHandler的职责单一,可复用强。 如果我们使用Stream的思维来理解,也很方便:
|
写的很清楚,谢谢。 SignalR可以做,因为客户端的库提供了。 |
我试着用客户端发了1mb的message,服务器分了好多次收到。
无论发字符串还是二进制数据,收到的都是字符串。
The text was updated successfully, but these errors were encountered: