Как отправить данные в каком-либо формате (JSON / XML / и т. Д.) С сервера на клиент с помощью веб-сокета - PullRequest
3 голосов
/ 05 февраля 2012

Следуя примеру из em-websocket gem, я только что создал простой эхо-сервер, работающий с каркасом Sinatra. Проблема в том, что я не понимаю, как использовать какой-либо формат для отправки сообщения вместо простого текста. На данный момент код выглядит так:

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
}

А на стороне клиента, используйте его для создания красивого окна сообщения с временными и текстовыми элементами (время в данном случае является лишь примером). например, используйте

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

вместо

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

1 Ответ

2 голосов
/ 05 февраля 2012

Это было довольно просто.Сгенерируйте строку 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)
...