本篇文章给大家谈谈ClientWebSocket.ConnectAsync立即关闭,以及websocket客户端关闭连接的知识点,同时本文还将给你拓展ActionCable:WebSocketConn
本篇文章给大家谈谈ClientWebSocket.ConnectAsync 立即关闭,以及websocket客户端关闭连接的知识点,同时本文还将给你拓展ActionCable: WebSocket Connection、api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合、C# WebSocket SendAsync 异常、c# – 为什么System.Net.Sockets.Socket.AcceptAsync在长时间不活动后与ConnectionReset一起完成?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- ClientWebSocket.ConnectAsync 立即关闭(websocket客户端关闭连接)
- ActionCable: WebSocket Connection
- api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合
- C# WebSocket SendAsync 异常
- c# – 为什么System.Net.Sockets.Socket.AcceptAsync在长时间不活动后与ConnectionReset一起完成?
ClientWebSocket.ConnectAsync 立即关闭(websocket客户端关闭连接)
您的代码可能还有其他问题(连接套接字和客户端需要一些麻烦才能搞定),但有两个明显的问题:
您需要等待 ConnectAsync(...)
的结果,才能停止 Start()
的代码在没有它的情况下同步继续:
await cws.ConnectAsync(address,sendCancelTokenSrc.Token);
并且您需要确保 cws
在完成之前不会被处理掉。 using(cws) { ... }
块将在代码离开花括号(当前立即发生)时处理 cws
,即使您的侦听器仍在运行,并且需要它保持活动状态。
您可以通过等待异步结果(例如提示!来自您的侦听器的最终结果)将代码保留在 using
块中来实现此目的,或者不使用 { {1}} 并在适当的时间手动处理 using
。
还要确保仅在连接调用完成后才启动侦听器,以确保 cws
处于良好状态。
像这样:
cws
而且……您的听众无疑也需要做更多的工作,但以上内容将使您解决眼前的问题(希望如此!)
ActionCable: WebSocket Connection
每次 HTTP 请求,都是一个 request 到 response 的过程,所以 HTTP 服务器不需要维护任何状态,
而 WebSocket 需要 server 维护所有的连接状态,Ruby 并不很擅长处理并发。ActionCable 为了性能和易用性,用到了很多有趣的技术。
比如 message 的 pub/sub 使用了 redis 的 pub/sub (也有其他的 adapter)。
在并发处理上,使用了 current-ruby 的 ThreadPoolExecutor,而处理 WebSocket 的连接,使用了 nio4r 和 websocket-driver。
下面主要介绍一下这两种技术和 I/O 模型。
websocket-driver
websocket-driver 主要处理 WebSocket 协议,并对 I/O 层做了解耦,也就是说,可以用不同的方式来处理 I/O 事件。同时提供了 :open,:message,:close 等一系列事件,方便使用。
使用 websocket-driver 的 Server-side scoket 需要实现两个方法,url 和 write(string)url
。
url 是用户用来连接 websocket 的url。
write(string)
方法用来将数据写入到 stream 内。
之后,当 I/O 监听到数据的时候,再调用 WebSocket::Driver#parse
方法对数据进行解析。
解析完成后,WebSocket 会通过 :message 事件将解析好的数据传回。
websocket-driver README 给出的 example 使用的是 EventMachine 处理 I/O 操作,而 ActionCable 则直接使用了 nio4r。
I/O 模型
I/O 操作,就是在主存(main memory)和外设之间做数据的复制操作。
而外设一般都比主存慢很多,为了处理速度不匹配问题,可以使用不同的方法对 I/O 进行操作,既 I/O 模型。
同步阻塞IO(Blocking IO)
同步阻塞 I/O,即传统的 I/O 模型。
简单来说,就是当进行 I/O 操作的时候,线程被挂起(suspend),直到 I/O 操作进行完,再执行程序之后的操作。也就是说,在进行 IO 操作的时候,线程一直处于等在状态,所以称为 Blocking IO,Ruby 提供了 IO.read 方法。
同步非阻塞IO(Non-blocking IO)
进行 IO 操作时,无论系统是否准备好数据,都直接返回。如果没有准备好,则返回 error,当用户收到 error 的时候,可以再次尝试 IO 操作。Ruby 提供了IO.read_nonblock 方法。
IO多路复用(IO Multiplexing)
通过 select
让 Kernal 挂起(suspend)当前线程,当一个或者多个 I/O 事件发生的时候,再把控制权交给应用程序。
IO多路复用适用于同时需要监听多个 IO 对象的场景。
select 的时间复杂度是 O(n),Linux 提供了更高效的版本 epoll
,epoll 时间复杂度是 O(log n))。thin 提供了是否使用 epoll 的选项。Ruby 提供了 IO.select 方法。
nio4r
nio4r 可以说是 java.nio 的 Ruby 实现,但提供了更简单的接口。
nio4r 主要有两个部分:
Selectors: 用来同时监控多个 I/O 对象
Monitors: 用来追踪所关心的 I/O 事件,比如读。
require "nio"
server = TCPServer.new("127.0.0.1", 12345)
selector = NIO::Selector.new
3.times do
client = server.accept
_monitor = selector.register(client, :r)
end
ready = selector.select
首先是创建一个 NIO::Selector对象,然后将所关心的 I/O 事件通过 NIO::Selector#registor 注册到 selector 对象上。
最后在一个循环内,调用 NIO::Selector#select 方法,选出 ready 的事件。
在 ActionCable 中处理 I/O 的类是 Connection::StreamEventLoop,初始化 selector 在 @nio ||= NIO::Selector.new
,然后由 StreamEventLoop#attach 方法将 I/O 事件注册到 nio selector 上。
最后由 run 方法来处理事件监听 run,使用 IO.read_nonblock
对 stream 进行读取操作。
References
- 支撑ActionCable的底层库
- Java NIO(3): IO模型
- Java NIO浅析
- A gentle introduction to nio4r: low-level portable asynchronous I/O for Ruby
- Computer Systems: A Programmer''s Perspective
- Programming Erlang : Software for a Concurrent World
api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合
API将为用户提供最新的链接.但是,我有一个系统,当用户点击此API时,会向消息队列添加一个作业,请求更新数据库中的链接.
完成此工作后,我会将新链接推送到Backbone集合.
我该怎么做?在我看来,我有两个选择:
>从Backbone集合中,长时间轮询API以获取新链接
>设置WebSockets以在作业完成时向集合发送“消息”,并使用它发送新数据
>为我的应用程序废弃REST API,只使用WebSockets来处理所有事情,因为我可能会在以后有更多的实时需求
带有REST API的WebSockets
如果我使用WebSockets,我不确定将其集成到我的Backbone集合中的最佳方法,以便它与REST API一起工作.
目前我的Backbone集合看起来像这样:
var Links = Backbone.Collection.extend({ url: '/api/links' });
我不确定如何启用Backbone集合来处理AJAX和WebSockets.我是否继续使用默认的Backbone.sync进行CRUD Ajax操作,然后手动处理单个WebSocket连接?在我脑海里:
var Links = Backbone.Collection.extend({ url: '/api/links',initialize: function () { var socket = io.connect('http://localhost'); socket.on('newLinks',addLinks) },addLinks: function (data) { // Prepend `data` to the collection }; })
问题
我应该如何实现我的实时需求,从上面的选项或你有任何其他想法?请提供代码示例以提供一些上下文.
您可以初始化WebSocket连接,如:
var ws = new Bakcbone.WS('ws://exmaple.com/');
并将模型绑定到它:
var model = new Backbone.Model(); ws.bind(model);
然后,此模型将使用ws:消息类型侦听消息事件,您可以调用model.send(data)通过该连接发送数据.
当然,收藏也是如此.
Backbone.WS还提供了一些工具,用于将类似自定义REST的API映射到模型/集合.
C# WebSocket SendAsync 异常
如何解决C# WebSocket SendAsync 异常?
我正在执行一个使用 WebSocketClient 与 Java Springboot websocketserver 通信的网络核心应用程序。 我从 C# 通过 websocket 发送了超过 20000 条消息:
await client.SendAsync(new ArraySegment<byte>(bytes),WebSocketMessageType.Text,true,_cancellationToken);
但是,有时,某些消息会给出下一个例外:
The Specified argument was out of the range of valid values
堆栈跟踪:
at System.Net.WebSOckets.ManagedWebSocket.<SendFrameFallbackAsync>d_61.MoveNext()
at System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at MyWebSocket.ClientHandler.<SendMessage>d_8.MoveNext() in C:\MyProjects\MyWebSocket\ClientHandler.cs:line 71
该行对应于上面放置的 Send async。
我已经尝试在 java 项目上增加 TextMessage 缓冲区大小,但无论字节大小如何,异常一直发生。并非所有消息都会发生这种情况,只有其中一些消息会发生这种情况。 这不会阻止 java springboot 继续接收消息并处理它们,所以我认为问题在于消息在 C# 客户端中发送的方式。
任何想法将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
c# – 为什么System.Net.Sockets.Socket.AcceptAsync在长时间不活动后与ConnectionReset一起完成?
我不确定如何设置接受连接的超时,即使这是一个好主意.有没有人有一个解决方法,也许有一些信息,为什么这是默认行为?
我在Microsoft Connect上查看filed a bug report是否有任何理由说明为什么超时期限不稳定.有时它会在五分钟内超时,其他时间则超过两小时.
解决方法
任何端口扫描您的服务器并进行半开放式SYN扫描都会产生类似的流量并导致同样的问题.为了防止软件中的拒绝服务漏洞,应该处理这种特殊情况.
我们今天的关于ClientWebSocket.ConnectAsync 立即关闭和websocket客户端关闭连接的分享已经告一段落,感谢您的关注,如果您想了解更多关于ActionCable: WebSocket Connection、api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合、C# WebSocket SendAsync 异常、c# – 为什么System.Net.Sockets.Socket.AcceptAsync在长时间不活动后与ConnectionReset一起完成?的相关信息,请在本站查询。
本文标签: