【发布时间】:2017-11-28 12:19:16
【问题描述】:
服务器(水晶)
require "http"
module Network
class WebSocket < HTTP::WebSocketHandler
HANDLERS = [] of HTTP::Handler
def initialize (@path : String, &@proc : HTTP::WebSocket, HTTP::Server::Context -> Nil)
HANDLERS << self
end
def self.run (host : String = "::", port : Int32 = 3030)
puts "Run server on ws://[#{host}]:#{port}"
HTTP::Server.new(host, port, HANDLERS).listen
end
end
end
Network::WebSocket.new "/" do |socket|
socket.send("Hello From Binary!".to_slice)
end
Network::WebSocket.run
客户端(JavaScript)
ws = new WebSocket("ws://[2a01:4f8:xx:xx::xx]:3030/")
ws.onmessage = (message) => {
console.log(message.data)
}
Console.log 显示 ArrayBuffer(13) 字节长度且没有任何负载。
但是! Python 客户端 (https://github.com/websocket-client/websocket-client) 工作正常。
from websocket import create_connection
ws = create_connection("ws://[::]:3030")
print("Receiving...")
result = ws.recv()
print("Received '%s'" % result)
ws.close()
二进制接收在 Chromium 和 firefox 中不起作用。
【问题讨论】:
-
您希望收到什么而不是数组缓冲区?您正在发送二进制数据。 stackoverflow.com/questions/6965107/…
-
但它不适用于
ws.binaryType = "blob"和ws.binaryType = "arraybuffer"。 -
唯一的方法是将字符串转换为ArrayBuffer?真的吗?什么...?
-
如果您对它不满意,请将其转换为 usigned int 数组,然后用它做任何您需要的事情;)
标签: javascript websocket crystal-lang