【问题标题】:Why JS-client doesn't receive binary from server?为什么 JS-client 没有从服务器接收二进制文件?
【发布时间】: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


【解决方案1】:

在客户端使用ws.binaryType = "arraybuffer" 并将其转换为Uint8Array

new Uint8Array(message.data) // => [72, 101, 108, 108, 111, 32, 70, 114, 111, 109, 32, 66, 105, 110, 97, 114, 121, 33]

与水晶服务器发送的字节数组匹配:

"Hello From Binary!".to_slice # => Bytes[72, 101, 108, 108, 111, 32, 70, 114, 111, 109, 32, 66, 105, 110, 97, 114, 121, 33]

【讨论】:

猜你喜欢
  • 2017-06-03
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多