使用被动套接字方式实现简单聊天室

-module(chat_server_passive).

%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
-define(DEFPORT, 1055).
-define(TCP_OPTIONS, [binary, {packet, 4}, {active, false}]).


%% ====================================================================
%% Internal functions
%% ====================================================================
start() -> 
	register(chat_server, spawn(fun() -> server_loop() end)),
	{ok, Listen} = gen_tcp:listen(?DEFPORT, ?TCP_OPTIONS),
	do_accept(Listen).

do_accept(Listen) ->
	{ok, Socket} = gen_tcp:accept(Listen),
	chat_server ! {new, Socket},
	spawn(fun() -> do_recv(Socket) end),
	do_accept(Listen).

do_recv(Socket) ->
	case gen_tcp:recv(Socket, 0) of
		{ok, Data} ->
			chat_server ! {data, Socket, Data},
			do_recv(Socket);	%% 此句确保可以多次接收客户端信息
		{error, _Reason} ->
			chat_server ! {fail, Socket}
	end.

server_loop() ->
	receive
		{new, Socket} ->
			io:fwrite("Welcome ~p~n", [Socket]);
		{data, Socket, Data} ->
			io:fwrite("~p: ~p~n", [Socket, binary_to_term(Data)]);
		{fail, Socket} ->
			io:fwrite("Goodbye ~p, welcome again!~n", [Socket])
	end, 
	server_loop().	%%  此句确保可以多次对chat_server发送消息


=============================================================================

-module(chat_client).

%% ====================================================================
%% API functions
%% ====================================================================
-export([start/0]).
-define(DEFPORT, 1055).


%% ====================================================================
%% Internal functions
%% ====================================================================
start() -> 
	{ok, Socket} = gen_tcp:connect("localhost", ?DEFPORT, [binary, {packet, 4}]),
	do_talk(Socket).

do_talk(Socket) ->
	Msg = io:get_line("Input your msg:"),
	gen_tcp:send(Socket, term_to_binary(Msg)),
	do_talk(Socket).

客户端很逻辑容易实现。最主要的是服务器端的两个递归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值