伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

我的erlang TCP服务器

来源:本站原创 浏览:153次 时间:2021-09-12

不解释,直接贴代码。

1) socket_options.hrl

-record(socket_options,        {port=8024,         loop,         name,         ip=any,         nodelay=false,         backlog=128,         listen=null,                         active_sockets=0}).

2)  test_server.erl


-module(test_server).-export([start/0, stop/0, looper/1]).-include("socket_options.hrl").%开启服务start()->  test_socket_server:start(#socket_options{loop = {?MODULE, looper}}).%关闭服务stop()->  test_socket_server:stop(). looper(Socket) ->    inet:setopts(Socket, [{active, once}]),    receive    {tcp, Socket, Data} ->        io:format("Got packet: ~p~n", [Data]),        gen_tcp:send(Socket, Data),        looper(Socket);    {tcp_closed, Socket}->        io:format("Socket ~p closed~n", [Socket]);    {tcp_error, Socket, Reason} ->        io:format("Error on socket ~p reason: ~p~n", [Socket, Reason])    end.


3) test_socket_server.erl


-module(test_socket_server).-export([start/0, start/1, stop/0, stop/1]).-export([init/1, handle_call/3, handle_cast/2, terminate/2, code_change/3,         handle_info/2]).-include("socket_options.hrl").-define(RECBUF_SIZE, 8192).start() ->gen_server:start(?MODULE, [], []).start(InitArg = #socket_options{name = Name}) ->    case Name of        undefined ->    gen_server:start({local,?MODULE}, ?MODULE, InitArgͶ��,����, []);        _ ->            gen_server:start({local,Name}, ?MODULE, InitArg, [])end.stop() ->  gen_server:cast(?MODULE, stop).stop(Name) when is_atom(Name) ->    gen_server:cast(Name, stop);stop(Pid) when is_pid(Pid) ->    gen_server:cast(Pid, stop);stop(_State = #socket_options{name = Name}) ->    stop(Name).%回调函数%init(State = #socket_options{ip = Ip, port = Port, backlog = Backlog, nodelay = NoDelay}) ->init(State = #socket_options{port = Port, backlog = Backlog, nodelay = NoDelay}) ->    BaseOpts = [binary,        {reuseaddr, true},        {packet, 0},        {backlog, Backlog},        {recbuf, ?RECBUF_SIZE},        {active, false},        {nodelay, NoDelay}],    listen(Port, BaseOpts, State).    %%监听         handle_call(_Msg, _Caller, State) -> {noreply, State}.handle_info(_Msg, Library) -> {noreply, Library}.terminate(Reason, #socket_options{listen = Listen}) ->    io:format("socket close,~p~n",[Reason]),    gen_tcp:close(Listen).             %%关闭Listencode_change(_OldVsn, State, _Extra) ->    State.handle_cast({accepted, _Pid}, State = #socket_options{active_sockets = ActiveSockets,             listen = Listen, loop = Loop}) ->    NewState = State#socket_options{active_sockets = 1 + ActiveSockets},    test_socket_server_acceptor:start_link(self(), Listen, Loop),    {noreply, NewState}; handle_cast(stop, Name) ->     %io:format("关闭服务器!~n"),    {stop, normal , Name}. listen(Port, Opts, State) ->    case gen_tcp:listen(Port, Opts) of        {ok, Listen} ->test_socket_server_acceptor:start_link(self(), Listen, State#socket_options.loop),NewState = State#socket_options{listen = Listen},{ok, NewState};        {error, Reason} ->            {stop, Reason}    end.

 4) test_socket_server_acceptor.erl



-module(test_socket_server_acceptor).-export([start_link/3, init/3]).start_link(Server, Listen, Loop) ->    proc_lib:spawn_link(?MODULE, init, [Server, Listen, Loop]).init(Server, Listen, Loop) ->    case catch gen_tcp:accept(Listen) of        {ok, Socket} ->            gen_server:cast(Server, {accepted, self()}),            call_loop(Loop, Socket);        {error, closed} ->            exit(normal);        {error, timeout} ->            init(Server, Listen, Loop);        {error, esslaccept} ->            exit(normal);        _ ->            exit({error, accept_failed})    end.call_loop({M, F}, Socket) ->    io:format("socket call_loop,~n"),    M:F(Socket);call_loop({M, F, [A1]}, Socket) ->    M:F(Socket, A1);call_loop({M, F, A}, Socket) ->    erlang:apply(M, F, [Socket | A]);call_loop(Loop, Socket) ->    Loop(Socket).

下一步是想在此基础上写一个聊天室什么的,不过我目前我想先实践完OTP实战这本书。


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net