Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 开始了解web套接字和http请求(以及STOMP)_C#_Node.js_Sockets_Websocket_Stomp - Fatal编程技术网

C# 开始了解web套接字和http请求(以及STOMP)

C# 开始了解web套接字和http请求(以及STOMP),c#,node.js,sockets,websocket,stomp,C#,Node.js,Sockets,Websocket,Stomp,我最近加入了一个新项目,我的任务是使用web套接字实现流式数据。其想法是,当前通过HTTP请求(以RESTful方式)公开一组信息,这些信息希望通过web套接字公开 在过去的48小时里,我做了一系列关于web套接字和STOMP的研究,并想澄清以下几点: 因此,对于通过web套接字而不是通过HTTP请求/响应进行连接的客户机和服务器,他们首先需要同意在他们之间建立web套接字连接。这是通过HTTP GET完成的,并且传递了一个唯一的头,该头表示他们将使用web套接字连接吗 理论上,假设有一大堆不同

我最近加入了一个新项目,我的任务是使用web套接字实现流式数据。其想法是,当前通过HTTP请求(以RESTful方式)公开一组信息,这些信息希望通过web套接字公开

在过去的48小时里,我做了一系列关于web套接字和STOMP的研究,并想澄清以下几点:

  • 因此,对于通过web套接字而不是通过HTTP请求/响应进行连接的客户机和服务器,他们首先需要同意在他们之间建立web套接字连接。这是通过HTTP GET完成的,并且传递了一个唯一的头,该头表示他们将使用web套接字连接吗

  • 理论上,假设有一大堆不同的数据通过某个API暴露给浏览器。想象一下,有一大堆不同的HTTP请求可以通过GET、POST和DELETE来实现。因此,要让所有这些信息的某些部分通过web套接字流式传输,是否只需更改每个资源的当前GET请求,以检查是否存在特殊的websocket头,然后执行一些操作?或者,为了通过web套接字公开某些数据片段,还必须执行其他操作。如果从HTTP请求初始化套接字,我可能会误解HTTP和套接字的关系

  • 我认为这是我的两个主要问题,我相信这些问题的答案将为我指明正确的方向,继续学习更多关于这个主题的知识。我试图找到任何好的示例代码示例,但我试图充分理解这一点,以便在本周内实现

    因此,对于通过web套接字而不是通过HTTP请求/响应进行连接的客户机和服务器,他们首先需要同意在他们之间建立web套接字连接。这是通过HTTP GET完成的,并且传递了一个唯一的头,该头表示他们将使用web套接字连接吗

    是的,差不多。标题为:

    Connection: Upgrade
    Upgrade: websocket
    Sec-WebSocket-Key: <random string, base64 encoded>
    Sec-WebSocket-Version: <version>
    
    理论上,假设有一大堆不同的数据通过某个API暴露给浏览器。想象一下,有一大堆不同的HTTP请求可以通过GET、POST和DELETE来实现。因此,要让所有这些信息的某些部分通过web套接字流式传输,是否只需更改每个资源的当前GET请求,以检查是否存在特殊的websocket头,然后执行一些操作?或者,为了通过web套接字公开某些数据片段,还必须执行其他操作。如果从HTTP请求初始化套接字,我可能会误解HTTP和套接字的关系

    听起来您似乎理解这一点,但我要指出的是,您只能使用GET启动WebSocket


    从您描述的内容来看,不清楚WebSocket是否是您真正想要的。WebSocket用于服务器和客户端之间的双向通信。如果您只想从服务器流式传输到客户端,那么使用服务器发送的事件会轻松得多。

    我花了48个多小时才真正了解这一点。与AJAX相比,这是一个很大的变化

    你的思维水平可能太低了。如果要将消息广播到多个浏览器,则有多个消息队列系统可以通过WebSocket进行对话(其中许多或所有都使用STOMP)

    但是,如果只需要发送私有数据,则可能需要在STOMP级别(或更低级别)停止。这项技术目前还不成熟,因为大多数解决方案都涉及前面提到的消息队列。理论上讲,STOMP应该允许在每一侧(浏览器和服务器)有多个端点来获取消息(在JavaScript和C#之间以JSON或XML序列化)。如果您不喜欢这种技术,那么使用WebSocket本身来回传递消息是相当容易的。在这种情况下,每侧都有一个接收者,然后传递一个简单的结构,比如一个字符串,该字符串命名消息,后跟一个逗号,然后消息本身以任何适合您的技术进行序列化(我更喜欢浏览器端的JSON,但XML也可以)

    祝你好运,用你在答案中没有学到的任何东西更新你的问题或对你接受的答案的评论,以便其他人能够从中学习


    更新:有人对.NET的WebSocket实现有更多的了解,请回答一些我不知道的细节,我没有时间调查。我的回答不完整,我只是没有时间在赏金到期前正确回答。

    如果您希望实际实现WebSocket通信,那么您一定要阅读规范:。我相信你已经看过了,但只是想确定一下。如果你只需要使用websocket通信(不需要实现规范),那么有很多库可以封装你所有的辛苦工作。Socket.io可能是更好的Node.js库之一,因为它在浏览器不支持web套接字的情况下使用回退。查看本文:本文的需求倾向于web套接字而不是服务器发送的事件。那么在这个“握手”发生之后,就不需要再发送http请求了?他们刚收到101,现场直播就开始了?@user3037172是的。但是,请注意,如果连接被切断,您必须手动重新连接并处理在您离开时丢失的消息。
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: <base64 encoded hash based on Sec-WebSocket-Key>