【问题标题】:Communicating with WebSocket server using a TCP class使用 TCP 类与 WebSocket 服务器通信
【发布时间】:2015-06-15 00:31:58
【问题描述】:

是否可以使用标准 TCP 类向 WebSocket 服务器接口发送和接收数据/消息/帧?

或者我需要从根本上改变 TCP 类吗?

如果可以的话,你能给我看一个小例子吗? (编程语言并不重要)
例如,我发现这个 node.js 代码代表一个简单的 tcp 客户端:

var net = require('net');

var client = new net.Socket();
client.connect(1337, '127.0.0.1', function() {
    console.log('Connected');
    client.write('Hello, server!');
});

client.on('data', function(data) {
    console.log('Received: ' + data);
});

也许你可以告诉我必须改变什么才能使它与 WebSocket 通信。

【问题讨论】:

  • webSocket 在 TCP 上运行,所以你只需要通过你的套接字说出 webSocket 协议。您可以使用或查看许多开源实现以了解其工作原理。您可能想知道所有 webSocket 连接都是从请求升级到 webSocket 协议的 HTTP 请求开始的,因此您必须通过确切的握手来初始化连接,然后一旦初始化,您就必须使用 webSocket 协议。

标签: sockets tcp websocket client


【解决方案1】:

Websockets 是一种在 TCP/IP 上运行的协议,详见 standard's draft

所以,其实都是利用TCP/IP连接(TCP连接类/对象)来实现协议特定的握手和数据的成帧。

用 Ruby 编写的 Plezi Framework 正是这样做的。

它将 TCPSocket 类包装在名为 Connection(或 SSLConnection)的包装器中,并通过协议输入层(WSProtocolHTTPProtocol 类)将数据运行到应用程序层,然后通过协议输出层(WSResponseHTTPResponse 类)到连接:

 TCP/IP receive -> Protocol input layer ->
     App -> Protocol output -> TCP/IP send

Websocket 握手始终以 HTTP 请求开始。你可以阅读the Plezi's handshake code here*。

* 握手方法接收一个 HTTPRequest、HTTPResponse 和一个 App Controller,并在切换到 Websockets 之前使用它们发送所需的 HTTP 回复。

握手完成后,收到的每条消息都由消息帧(一个或多个)组成。你可以阅读frame decoding and message extraction code used in the Plezi Framework here

在发回消息之前,将它们分成一个或多个Websocket Protocol frames using this code,然后它们是sent using the TCP/IP connection

如果你用谷歌搜索的话,那里有很多例子。我确信其中一些会使用您喜欢的编程语言。

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 2021-12-29
    • 2014-03-18
    • 2013-07-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多