首页 > 解决方案 > 嗨,我正在处理 Yaws 网络套接字连接问题

问题描述

我偶然发现了一个成功启用 Web 浏览器和 Yaws Web 服务器之间的 Web 套接字连接的问题。我想展示的客户端的 Javascript 代码示例和服务器的 Erlang 代码示例都来自名为“使用 Erlang 构建 Web 应用程序”的编程教科书中的示例。我有一种感觉,问题在于我运行的 Yaws Web 服务器版本比本书更高,准确地说是“2.0.6”;但我不知道。我想知道你的想法。谢谢你。

Javascript 代码示例(客户端)。

   $(function ()
{
  var WebSocket = window.WebSocket || window.MozWebSocket;
  var socket = new WebSocket("ws://localhost:8080/");

  // wait for socket to open
  socket.onopen = function ()
  {


   $('input#echo').on('keypress', function (event)


                       {
                       if (event.which == 13) {
                       event.preventDefault();
                       var msg = $(this).val();

                       socket.send(JSON.stringify(
                       {
                                message:msg
                       }
                       ));
                       }
                       });

                        socket.onmessage = function(msg)
                        {
                             var message = $.parseJSON(msg.data);
                             var html    = $('div#messages').html() + message.message + "<br>\n";
                             $('div#message').html(html);
                        }
                        }

                       });
Upgrade: WebSocket

Erlang 代码示例(服务器端)

    -module(sole_callback).

%% Export for websocket callbacks
-export([handle_message/1, say_hi/1]).


handle_message({binary, Message}) ->
      io:format("~p:~p basic echo handler got ~p~n",
             [?MODULE, ?LINE, Message]),
      {reply, {binary, <<Message/binary>>}}.

say_hi(Pid) ->
      io:format("asynchronous greetings~n", []),
      yaws_api:websocket_send(Pid, {text, <<"hi there!">>}).

Erlang 代码示例(嵌入式模式)

<script language="Javascript" type="text/javascript" src="jquery.min.js"></script><script language="Javascript" type="text/javascript" src="record.js"></script><script language="Javascript" type="text/javascript" src="socket.js"></script>

<erl>
out(Arg) ->
{html, "<img src=images_folder/audio.png onclick=socket.onopen() width=25px height=25px>"}.
</erl>

<erl>


get_upgrade_header(#headers{other=L}) ->
lists:foldl(fun({http_header,_,KO,_,V}, undefined) ->
                    K = case is_atom(KO) of
                            true ->
                                 atom_to_list(KO);
                            false ->
                                 KO
                        end,
                    case string:to_lower(K) of
                        "upgrade" ->
                            true;
                       _ ->
                            false
                    end;
               (_, ACC) ->
                    ACC
           end, undefined, L).


%%------------------------------------------------------------------------------
out(Arg) ->
   case get_upgrade_header(Arg#arg.headers) of
   true ->
       error_logger:warning_msg("Not a web socket client~n"),
       {content, "text/plain", "You're not a web sockets client! Go away!"};
   false ->
       error_logger:info_msg("Starting web socket~n"),
       {websocket, sole_callback, []}
   end.
</erl>

标签: javascripthtmlyawserl

解决方案


推荐阅读