erlang 聊天室

来源:互联网 发布:java就是业务逻辑吗 编辑:程序博客网 时间:2024/05/21 09:19

服务端

-module(chatServer).-export([start/1]).start(Port) ->    {ok, Listen} = gen_tcp:listen(Port, [binary, {active, true}, {packet, 4}, {reuseaddr, true}]),    spawn(fun() -> newConnect(Listen) end),    register(server, spawn(fun() -> loop(dict:new()) end)).newConnect(Listen) ->    {ok, Socket} = gen_tcp:accept(Listen),    server ! {addClient, Socket},    spawn(fun() -> newConnect(Listen) end),    listenClient(Socket).listenClient(Socket) ->    receive        {tcp, Socket, Bin} ->            server ! {sendClient, Socket, Bin}    end,    listenClient(Socket).loop(Dict) ->    receive        {sendClient, _Socket, Bin} ->            dict:map(              fun(Key, _Value) ->                      gen_tcp:send(Key, Bin)              end,              Dict             ),              loop(Dict);        {addClient, Socket} ->            NewDict = dict:store(Socket, 0, Dict),            loop(NewDict)    end.
客户端

-module(chatClient).-export([start/2, sendMsg/1]).start(Ip, Port) ->    register(      client,      spawn(fun() ->                    {ok, Socket} = gen_tcp:connect(Ip, Port, [binary, {packet, 4}]),                    loop(Socket)            end      )).%% 这里面的代码需要放到一个进程下,不然无法通信loop(Socket) ->    receive        {sendMessage, Str} ->            gen_tcp:send(Socket, term_to_binary(Str)),            loop(Socket);        {tcp, Socket, Bin} ->            Value = binary_to_term(Bin),            io:format("receive ~p~n", [Value]),            loop(Socket);        {tcp_closed, Socket} ->            io:format("socket close~n")    end,    loop(Socket).sendMsg(Str) -> client ! {sendMessage, Str}.

主要还是在进程创建和通信方面需要多注意下

0 0
原创粉丝点击