我正在尝试使用 socket.io 连接到此 websocket api:
https://www.cryptocompare.com/api/#-api-web-socket-
(wss://streamer.cryptocompare.com)
我想我不太了解 socket.io。
我创建了一个空白的 html 文档:
<!doctype html>
<html lang="en">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.slim.js"></script>
</head>
<body>
<div id="data-show">
</div>
<button id="connect-sock">Connect</button>
<button id="disconnect-sock">DISConnect</button>
</body>
<script src="index.js"></script>
</html>
index.js:
var socket = io('wss://streamer.cryptocompare.com')
console.log('connected')
var btn = document.getElementById('connect-sock')
var btn2 = document.getElementById('disconnect-sock')
var show = document.getElementById('data-show')
//I also tried adding an event listener to a button so when i clicked it, it would do this:
socket.emit('SubAdd', { subs: ['0~Poloniex~BTC~USD'] } )
//Same result of nothing.
socket.on('SubAdd', function(data){
console.log(data)
})
服务器.js:
var express = require('express')
var socket = require('socket.io')
var app = express()
var server = app.listen(4000, function(){
console.log("well met")
})
app.use(express.static('public'))
var io = socket(server)
io.on('connection', function(socket){
console.log('well met from socket connection', socket.id)
})
server.js 位于名为“socket-test”的文件中。 index.html 和index.js 位于'socket-test/public/'
由于某种原因,在 server.js 中,socket.id 将不会登录到控制台。就好像这个函数被跳过了。但是当我将index.js中的地址更改为http://localhost:4000时,我在控制台中得到了 socket.id...不知道那里发生了什么。
编辑:我在使用 wss://streamer.cryptocompare.com/时很少获得套接字 ID,有时会,但大多数时候不会。当我切换到本地主机,运行服务器,停止服务器,然后切换回流媒体时,它通常可以工作,但如果我重新加载,我就不再获得socket.id了。
我认为我要求它在这里做的就是将 subs 发送到 wss://streamer.cryptocompare,然后发送 subs 后返回的 console.log(data) 。
我在这里遗漏了什么吗?
如果我明显遗漏了一些东西,请提前抱歉。我现在才知道 socket.io 大约 3 天,直到今天我才在 YouTube 上观看了基本教程。
最佳答案
您不需要 Express 代码,因为在这种情况下,您想要与之通信的服务器位于 cryptocompare 服务器上,而不是本地服务器。当您在 HTML 文件中初始化 io
对象时,这会在您的代码中捕获。
当然,如果您更熟悉 Node,您仍然可以使用 Node 与 cryptocompare websockets API 进行对话。但这样你就不需要浏览器内的 JavaScript 了。无论哪种方式,您需要的是在任何运行时创建某种能够使用 websockets 并可以与 cryptocompare websockets API 进行交互的客户端。
关于被跳过的代码——你是对的!这是。 socket.io是一个事件驱动的 WebSockets 框架。这意味着客户端注册他们对某些类型的事件/消息的兴趣,并且当触发这些事件/消息时,将调用称为回调的特殊函数。
如果有帮助的话,您可以将这些事件想象成聊天室中的 channel - 如果您不在正确的房间中,您将看不到该房间的消息。因此,您需要知道应该监听哪些消息,注册您对这些消息的兴趣,并为每条消息注册回调函数。
值得庆幸的是,cryptocompare 提供了客户端代码示例,可以帮助您了解应该监听的消息类型。 请参阅here
关于javascript - Socket.io 和 Express 不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040783/