服务端
-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}.
主要还是在进程创建和通信方面需要多注意下