Javascript 如何使用sinatra websocket发送二进制数据?
Sinatra websocket已经安装在我的Ubuntu系统上,可以使用文本字符串与浏览器中的JavaScript客户端进行通信 因为它适用于文本,所以我想从浏览器中的JavaScript客户端传输一些二进制数据,该客户端从画布获取图像数据,并使用WebSocket将其发送到Sinatra服务器。当服务器从客户机获取数据时,它只是将其发送回。 当服务器将接收到的内容发送回时,会发生错误。经过一夜的努力,我仍然不知道如何克服它 客户端JavaScript代码:Javascript 如何使用sinatra websocket发送二进制数据?,javascript,ruby,websocket,sinatra,Javascript,Ruby,Websocket,Sinatra,Sinatra websocket已经安装在我的Ubuntu系统上,可以使用文本字符串与浏览器中的JavaScript客户端进行通信 因为它适用于文本,所以我想从浏览器中的JavaScript客户端传输一些二进制数据,该客户端从画布获取图像数据,并使用WebSocket将其发送到Sinatra服务器。当服务器从客户机获取数据时,它只是将其发送回。 当服务器将接收到的内容发送回时,会发生错误。经过一夜的努力,我仍然不知道如何克服它 客户端JavaScript代码: var imgSocket =
var imgSocket = new WebSocket("ws://" + window.location.host + "/img");
var sendImageData = function(){
var e = document.getElementById("canvas1");
var c = e.getContext('2d');
var img = c.getImageData(0,0,200,200);
var binary = new Uint8Array(img.data.length);
for (var i = 0; i < img.data.length; i++) {
binary[i] = img.data[i];
}
imgSocket.send(binary.buffer);
};
var-imgSocket=newwebsocket(“ws://“+window.location.host+”/img”);
var sendImageData=函数(){
var e=document.getElementById(“canvas1”);
var c=e.getContext('2d');
var img=c.getImageData(0,0200200);
var binary=新的Uint8Array(img.data.length);
对于(变量i=0;i
服务器端Ruby代码:
require 'sinatra'
require 'sinatra-websocket'
set :bind, "0.0.0.0"
set :img_sockets, []
get '/img' do
if !request.websocket?
"hello"
else
request.websocket do |ws|
ws.onopen do
puts "img_socket opened"
settings.img_sockets << ws
end
ws.onmessage do |msg|
EM.next_tick {settings.img_sockets.each {|s| s.send(msg)}} #error occurs here
#EM.next_tick {settings.img_sockets.each {|s| s.send("message from server")}} #if I just send back a text message, it’s OK.
end
ws.onclose do
puts "img_socket closed"
settings.img_sockets.delete(ws)
end
end
end
end
需要“sinatra”
需要“sinatra websocket”
设置:绑定“0.0.0.0”
设置:img_插座,[]
获取“/img”do
如果!请求websocket?
“你好”
其他的
request.websocket do | ws|
ws.onopen do
将“img_插座打开”
settings.img_套接字似乎已在此处提交此问题:
Stopping ...
/home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/eventmachine-1.0.3/lib/em/connection.rb:266:in `close_connection': eventmachine not initialized: evma_close_connection (RuntimeError)
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/eventmachine-1.0.3/lib/em/connection.rb:266:in `close_connection'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/backends/base.rb:95:in `block in stop!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/backends/base.rb:95:in `each_value'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/backends/base.rb:95:in `stop!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/server.rb:190:in `stop!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/sinatra-1.4.4/lib/sinatra/base.rb:1406:in `quit!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/sinatra-1.4.4/lib/sinatra/base.rb:1431:in `ensure in run!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/sinatra-1.4.4/lib/sinatra/base.rb:1431:in `run!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/sinatra-1.4.4/lib/sinatra/main.rb:25:in `block in <module:Sinatra>'
Stopping ...
/home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/eventmachine-1.0.3/lib/em/connection.rb:266:in `close_connection': eventmachine not initialized: evma_close_connection (RuntimeError)
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/eventmachine-1.0.3/lib/em/connection.rb:266:in `close_connection'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/backends/base.rb:95:in `block in stop!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/backends/base.rb:95:in `each_value'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/backends/base.rb:95:in `stop!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/thin-1.6.1/lib/thin/server.rb:190:in `stop!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/sinatra-1.4.4/lib/sinatra/base.rb:1406:in `quit!'
from /home/uncutstone/.rvm/gems/ruby-2.0.0-p353/gems/sinatra-1.4.4/lib/sinatra/base.rb:1505:in `block in setup_traps'