注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[erlang] echo server  

2010-02-12 11:51:08|  分类: lang_erlang |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
超级简单的 echo server 登场~~~
> c("echosvr").
> echosvr:start_echo_server().
很简单,就是监听7788端口,同时使用line-based的处理方式({packet,line})。

整个执行流程也很简单
  <1> start_echo_server 打开 listen_fd,然后启动一个独立的 process 等待 accept
  <2> 每次收到一个新的 connection,则再启动一个 process 等的 accept,而当前 process 则直接处理当前的连接

---------------------------------------------
-module(echosvr).

-export([start_echo_server/0]).

start_echo_server() ->
    {ok, Listen} = gen_tcp:listen(7788, [binary, {packet, line}, {reuseaddr, true}]),
    spawn(fun() -> listen_connection(Listen) end).

listen_connection(Listen) ->
    {ok, Socket} = gen_tcp:accept(Listen),
    spawn(fun() -> listen_connection(Listen) end),
    loop(Socket).

loop(Socket) ->
    receive
        {tcp, Socket, Bin} ->
            gen_tcp:send(Socket, Bin),
            loop(Socket)
    end.
---------------------------------------------

elixir(http://elixir-lang.org/) 的实现
$ bin/elixirc echo.ex            // 得到 ::EchoServer.beam
$ bin/iex
> EchoServer.start(7788)
---------------------------------------------
defmodule EchoServer do
  def start(port) do
    {:ok, listenfd} = Erlang.gen_tcp.listen(port, [:binary, {:packet, :line}, {:reuseaddr, true}])
    spawn(fn() -> wait_conn(listenfd) end)
  end

  def wait_conn(listenfd) do
    {:ok, s} = Erlang.gen_tcp.accept(listenfd)
    spawn(fn() -> wait_conn(listenfd) end)
    worker(s)
  end

  def worker(s) do
    receive do
    match: {:tcp, ^s, data}
      Erlang.gen_tcp.send(s, data)
      worker(s)
    end
  end
end
---------------------------------------------
  评论这张
 
阅读(1334)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017