Erlang和websockets

时间:2010-11-22 13:27:43

标签: erlang websocket

前段时间我在Erlang和websocket上找到了Joe Armstrong的例子,但是我无法让它工作。

我在Erlang代码中修复了错误和一些警告,但是使用Apache我无法获得良好的结果。

任何人都可以通过一个非常简单的例子给我一些提示吗?我是否需要将带有JavaScript的网页放在Apache目录中,就像普通的PHP文件一样?

3 个答案:

答案 0 :(得分:8)

Joe的websocket示例已过时,依赖于协议的过时版本。最新的浏览器使用更新版本(draft-00)

截至今天,misultin提供了一个很好的erlang实现。经过测试并与当前浏览器兼容:

https://github.com/ostinelli/misultin/blob/master/src/misultin_websocket.erl

答案 1 :(得分:8)

Yaws网络服务器提供了websocket实现。我还写了一个简化基于ws的应用程序编写的行为。它是我的Erlang工具的一部分(嗯,实际上是第一个):

https://github.com/schemeway/erlang-tools

答案 2 :(得分:3)

我发现SockJS-Erlang库非常好用。最重要的是,如果websockets不可用,它支持回退传输。它使用Cowboy(虽然是旧版本)作为底层服务器,因为它很容易集成。 This escriptthis HTML page将为您提供可以玩的工作演示。

这是一个带注释的例子:

start_link(_) ->
    application:start(sockjs),
    application:start(cowboy),

    % generate a SockJS handler
    SockjsState = sockjs_handler:init_state(
                    <<"/browser_socket">>, fun handle_client/3, state, []),

    % build the dispatch routes for Cowboy integrating the SockJS handler
    Routes = [{'_',  [{[<<"echo">>, '...'],
                       sockjs_cowboy_handler, SockjsState}]}],

    % start the cowboy server
    cowboy:start_listener(http, 100,
                          cowboy_tcp_transport, [{port,     8081}],
                          cowboy_http_protocol, [{dispatch, Routes}]),

% called when a new client connects
handle_client(Conn, init, state) -> {ok, state};

% called when data is received 
handle_client(Conn, {recv, Data}, state) ->
  % reply to client
  Conn:send(Data);

% called when connection is closed
handle_client(_Conn, closed, state) -> {ok, state}.

我对Apache的建议是将HAProxy用于WebSocket连接,使用Apache来提供Javascript和PHP。