使用主动套接字方式实现简单套接字

本文介绍了一个基于Erlang语言实现的简单聊天服务器代码示例。通过使用gen_tcp模块,该服务器能够监听指定端口并接受来自客户端的连接请求。文章展示了如何处理客户端连接、接收客户端发送的数据,并通过递归函数确保可以接收到客户端发送的多条消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-module(chat_server_active).

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


%% ====================================================================
%% Internal functions
%% ====================================================================
start() -> 
	{ok, Listen} = gen_tcp:listen(?DEFPORT, ?TCP_OPTIONS),
	do_accept(Listen).

do_accept(Listen) ->
	{ok, Socket} = gen_tcp:accept(Listen),
	io:fwrite("Welcome ~p~n", [Socket]),
%% 	%% 接收多个客户端的链接,无法获取客户端发送的消息	(recv_loop()中不论是否存在尾递归时)
%% 	spawn(fun() -> recv_loop(Socket) end),
%% 	do_accept(Listen).
%% 	%% 接收多个客户端的链接,每个客户端只能获取第一条消息	(recv_loop()中无尾递归时)
%% 	%% 接收一个客户端的链接,可获取该客户端的多条消息	(recv_loop()中存在尾递归时)
%% 	recv_loop(Socket),
%% 	do_accept(Listen).
%% 	%% 接收多个客户端的链接,每个客户端只能获取第一条消息	(recv_loop()中无尾递归时)
%% 	%% 接收一个客户端的链接,可获取该客户端的多条消息	(recv_loop()中存在尾递归时)
%% 	recv_loop(Socket),
%% 	spawn(fun() -> do_accept(Listen) end).
	%% 接收多个客户端,每个客户端只能获取第一条消息		(recv_loop()中无尾递归)
	%% 接收多个客户端,每个客户端都可以获取多条消息		(recv_loop()中存在尾递归)
	spawn(fun() -> do_accept(Listen) end),
	recv_loop(Socket).
%% 	%% 接收多个客户端的链接,无法获取任一客户端发送的消息	(recv_loop()中存在尾递归时)
%% 	spawn(fun() -> recv_loop(Socket) end),
%% 	spawn(fun() -> do_accept(Listen) end).

recv_loop(Socket) ->
%% 	io:fwrite("~p recvint...~n", [Socket]),
	receive
		{tcp, Socket, Data} ->
			io:fwrite("~p:~p~n", [Socket, binary_to_term(Data)]),
			recv_loop(Socket);		%% 确保获取多条客户端信息
		{tcp_closed, Socket} ->
			io:fwrite("tcp send closed!~n")
	end.
不同的递归,结果差别很大。谁能详细解释一下?

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

-module(chat_client).

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


%% ====================================================================
%% Internal functions
%% ====================================================================
start() -> 
	{ok, Socket} = gen_tcp:connect("localhost", ?DEFPORT, [binary, {packet, 0}]),
	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、付费专栏及课程。

余额充值