7

我正在尝试一个非常基本的服务器/客户端演示。我在客户端(浏览器中的用户)上使用 socket.io,在服务器上使用 eventmachine Echo 示例。理想情况下,socket.io 应该向服务器发送请求,服务器将打印接收到的数据。不幸的是,有些事情并没有像我期望的那样工作。

源码贴在这里:

socket = new io.Socket('localhost',{
        port: 8080
    });
    socket.connect();
    $(function(){
        var textBox = $('.chat');
        textBox.parent().submit(function(){
            if(textBox.val() != "") {
                //send message to chat server
                socket.send(textBox.val());
                textBox.val('');
                return false;
            }
        });
        socket.on('message', function(data){
            console.log(data);
            $('#text').append(data);
        });
    });

这是红宝石代码:

require 'rubygems'
require 'eventmachine'
require 'evma_httpserver'
class Echo < EM::Connection
  def receive_data(data)
    send_data(data)
  end
end

EM.run do
  EM.start_server '0.0.0.0', 8080, Echo
end
4

3 回答 3

9

您的客户端代码正在尝试使用 websockets 协议连接到服务器。但是,您的服务器代码不接受 websockets 连接 - 它只做 HTTP。

一种选择是使用事件机 websockets 插件:

https://github.com/igrigorik/em-websocket

EventMachine.run {

    EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
        ws.onopen {
          puts "WebSocket connection open"

          # publish message to the client
          ws.send "Hello Client"
        }

        ws.onclose { puts "Connection closed" }
        ws.onmessage { |msg|
          puts "Recieved message: #{msg}"
          ws.send "Pong: #{msg}"
        }
    end
}
于 2011-04-19T17:41:19.027 回答
3

我会考虑使用Cramp。它是一个支持 websockets 的异步框架,建立在 EventMachine 之上。我玩过这些示例,我不得不承认 API 看起来优雅而干净。

于 2012-03-23T05:43:38.397 回答
0

我会调查Plezi

您的服务器端回显代码可能如下所示:

require 'plezi'

class EchoCtrl
    def index
        redirect_to 'http://www.websocket.org/echo.html'
    end
    def on_message data
        # to broadcast the data add:
        # broadcast :_send_message, data
        _send_message data
    end
    def _send_message data
        response << data
    end
end

listen 

# you can add, a socket.io route for JSON with socket.io
route '/socket.io', EchoCtrl
route '/', EchoCtrl

exit只需在 IRB 中键入它,一旦您使用该命令退出 IRB,echo 服务器就会开始运行。

Plezi 使用并支持 Websockets、HTTP 流和 RESTful HTTP 请求真的很有趣,因此很容易依赖长拉并提供静态内容以及实时更新。

Plezi 还内置了对 Redis 的支持,因此可以跨进程和机器推送数据。

于 2014-12-07T11:50:32.903 回答