GVKun编程网logo

ClientWebSocket.ConnectAsync 立即关闭(websocket客户端关闭连接)

15

本篇文章给大家谈谈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客户端关闭连接)

ClientWebSocket.ConnectAsync 立即关闭(websocket客户端关闭连接)

您的代码可能还有其他问题(连接套接字和客户端需要一些麻烦才能搞定),但有两个明显的问题:

您需要等待 ConnectAsync(...) 的结果,才能停止 Start() 的代码在没有它的情况下同步继续:

await cws.ConnectAsync(address,sendCancelTokenSrc.Token);

并且您需要确保 cws 在完成之前不会被处理掉。 using(cws) { ... } 块将在代码离开花括号(当前立即发生)时处理 cws,即使您的侦听器仍在运行,并且需要它保持活动状态。

您可以通过等待异步结果(例如提示!来自您的侦听器的最终结果)将代码保留在 using 块中来实现此目的,或者不使用 { {1}} 并在适当的时间手动处理 using

还要确保仅在连接调用完成后才启动侦听器,以确保 cws 处于良好状态。

像这样:

cws

而且……您的听众无疑也需要做更多的工作,但以上内容将使您解决眼前的问题(希望如此!)

ActionCable: WebSocket Connection

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 – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合

我有一个Backbone应用程序,它有一个名为Links的集合.链接映射到/ api / links的REST API URI.

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
  };
})

问题

我应该如何实现我的实时需求,从上面的选项或你有任何其他想法?请提供代码示例以提供一些上下文.

别担心! Backbone.WS让你满意.

您可以初始化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 异常

如何解决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一起完成?

c# – 为什么System.Net.Sockets.Socket.AcceptAsync在长时间不活动后与ConnectionReset一起完成?

看来,当您使用有效的socketasynceventargs调用Socket.AcceptAsync并正确装配socketasynceventargs.Completed事件并且很长一段时间内没有接受任何连接时它只会重置连接.虽然,我的Socket.ReceiveTimeout和Socket.SendTimeout都是零.

我不确定如何设置接受连接的超时,即使这是一个好主意.有没有人有一个解决方法,也许有一些信息,为什么这是默认行为?

我在Microsoft Connect上查看filed a bug report是否有任何理由说明为什么超时期限不稳定.有时它会在五分钟内超时,其他时间则超过两小时.

解决方法

在玩了一下之后,我发现单个SYN – > SYN-ACK – > RST序列将引发socketasynceventargs.Completed事件并导致socketasynceventargs.socketError属性成为SocketError.ConnectionReset.看来这是预期的行为,但它肯定是一个问题,应该更好地记录.

任何端口扫描您的服务器并进行半开放式SYN扫描都会产生类似的流量并导致同样的问题.为了防止软件中的拒绝服务漏洞,应该处理这种特殊情况.

我们今天的关于ClientWebSocket.ConnectAsync 立即关闭websocket客户端关闭连接的分享已经告一段落,感谢您的关注,如果您想了解更多关于ActionCable: WebSocket Connection、api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合、C# WebSocket SendAsync 异常、c# – 为什么System.Net.Sockets.Socket.AcceptAsync在长时间不活动后与ConnectionReset一起完成?的相关信息,请在本站查询。

本文标签: