如何使用web-socket从服务器到客户端以某种格式(JSON / XML /等)发送数据

时间:2012-02-05 09:42:05

标签: ruby websocket eventmachine em-websocket

通过以下来自em-websocket gem的示例,我只创建了与Sinatra框架一起运行的简单echo服务器。问题是我不明白如何使用某种格式来发送消息而不是纯文本。目前,代码如下:

EventMachine::WebSocket.start(host: '0.0.0.0', port: 8080, debug: true) do |ws|
  ws.onmessage { |msg|
    ws.send msg 
  }
  ...
}

我想以某种格式发送消息,例如Hash:

ws.onmessage { |msg|
  hash_message = {}
  hash_message[:time] = Time.now.strftime("%T")
  hash_message[:text] = msg
  ws.send hash_message
}

在客户端,使用它来构建带有时间和文本div的漂亮消息框(在这种情况下,时间只是示例)。 例如,使用

  ws.onmessage = (evt) ->
    write_message(evt.data.time, 
                  evt.data.text)

而不是

  ws.onmessage = (evt) ->
    write_message evt.data

1 个答案:

答案 0 :(得分:2)

这很简单。在客户端生成json字符串:

send_message = (text) ->
  ws.send JSON.stringify({event:"user_message", data: {text: text}})

在服务器上解析此字符串,并将其发送回客户端(增加时间):

EventMachine::WebSocket.start(host: '0.0.0.0', port: 8080, debug: true) do |ws|
  ws.onmessage { |msg|
    msg = JSON.parse(msg)

    ws.send JSON.generate({
      time: Time.now.strftime("%T"),
      text: msg["data"]["text"]
    })
  }
  ...
end

并在客户端获取时显示此消息

window.onload = -> 
  ws.onmessage = (evt) ->
    data = JSON.parse(evt.data)
    write_message(data.time, 
                  data.text)
相关问题