尝试使用socket.io-client连接到用Go编写的websocket服务器。我已经使用节点WebSocket库(npm)成功连接。所以工作的Websocket代码如下所示:
goSocketPort = 6060
url = "ws://localhost:#{goSocketPort}/streamresults/"
ws = new WebSocket(url)
ws.on('open', ->
log "socket opened"
)
ws.on('message', (message) ->
console.log('received: %s', message)
#log "Socket message: #{JSON.stringify message}"
)
非常简单且有效 - 另一端的套接字以固定频率发送消息。但我最初尝试使用socket.io-client
(npm)并且无法让它继续下去。它当然将websocket列为首选的传输,但该死的,如果我可以连接它:
socket = ioClient.connect("#{url}", {port: goSocketPort, transports: ['xhr-polling', 'websocket']})
socket.on("connect", (r) ->
log "connected to #{url}"
)
连接永远不会发生,因此没有on
个事件被触发,代码会立即退出。我已经尝试过:将端口从网址中删除并将其添加到选项中,不使用传输选项(根据文档意味着“全部”)并使用http网址。 socket-io.client
无法连接到“标准”websocket吗?
答案 0 :(得分:31)
根据我们的聊天情况,您似乎被这句话误导了:
socket.io客户端基本上是一个简单的HTTP Socket接口实现。当用户的浏览器不支持WebSocket时,它看起来类似于WebSocket,同时提供附加功能并利用其他传输。
这意味着它从与Socket.io客户端/服务器交互的客户端/服务器代码的角度看起来与WebSocket类似。但是,网络流量看起来与简单的WebSocket非常不同 - 除了在连接之后构建在WebSocket之上的更健壮的协议之外,还有初始握手。握手描述为here,消息协议here(两者都是指向Socket.IO协议规范的链接)。
如果您正在编写WebSocket服务器,那么除非您打算实现所有Socket.io协议,否则最好只使用裸WebSocket接口而不是Socket.io客户端。
答案 1 :(得分:1)
不确定当时是否是这种情况,但是socket.io的网站现在直接在文档中说明了这一点。
尽管Socket.IO确实在可能的情况下使用WebSocket作为传输方式, 它将附加的元数据添加到每个数据包。这就是为什么WebSocket 客户端将无法成功连接到Socket.IO服务器, 并且Socket.IO客户端将无法连接到纯文本 要么是WebSocket服务器。