erlang 聊天室

服务端

-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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值