随记(2)socket套接字编程

一、简单版(接收一个连接,关闭监听)

%%---------------------------------------------------------------------------------
%% @doc 
%% 服务器
%% @end
%%---------------------------------------------------------------------------------
tcp_server () ->
	{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 1}]), %%-----监听
	{ok, Socket} = gen_tcp:accept(Listen), %%-----接受,阻塞在这
	gen_tcp:close(Listen),
	loop(Socket).

loop (Socket) ->
	receive
		{tcp, Socket, Bin} ->
			io:format("Server receive binary is : ~p~n", [Bin]),
			Str = erlang:binary_to_term(Bin),
			io:format("Server receive String is :~p~n", [Str]),
			gen_tcp:send(Socket, erlang:term_to_binary(Str)),
			loop(Socket);
		{tcp_closed, Socket} ->
			io:format("Server Socket closed~n")
	end.
	
%%---------------------------------------------------------------------------------
%% @doc 
%% 客户端
%% @end
%%---------------------------------------------------------------------------------
tcp_client (String) ->
	Host = "localhost",
	{ok, Socket} = gen_tcp:connect(Host, 2345, [binary, {packet, 1}]),
	gen_tcp:send(Socket, erlang:term_to_binary(String)),
	receive
		{tcp, Socket, Bin} ->
			io:format("Client receive binary is : ~p~n", [Bin]),
			Str = erlang:binary_to_term(Bin),
			io:format("Client receive String is :~p~n", [Str]),
			gen_tcp:close(Socket)
	end.

二、顺序服务端(接收到一个连接,处理完消息,继续监听)

%---------------------------------------------------------------------------------
% @doc 
% 服务器,顺序版
% @end
%---------------------------------------------------------------------------------
tcp_server_seq () ->
	{ok, Listen} = gen_tcp:listen(2345, [binary, {packet,1},{reuseaddr, true},{active, true}]),
	seq_loop(Listen).
seq_loop (Listen) ->
	{ok, Socket} = gen_tcp:accept(Listen), %%-----阻塞在这,知道监听到连接
	loop(Socket),
	seq_loop(Listen).
loop (Socket) ->
	receive %%-----消息接受一次就没有,所以要loop
		{tcp, Socket, Bin} ->
			io:format("tcp_server_seq receive binary is : ~p~n", [Bin]),
			Str = binary_to_term(Bin),
			io:format("tcp_server_seq receive string is : ~p~n", [Str]),
			gen_tcp:send(Socket, erlang:term_to_binary(Str)),
			loop(Socket);
		{tcp_closed, Socket} ->
			io:format("tcp_server_seq Socket closed~n")
	end.
	
%%---------------------------------------------------------------------------------
%% @doc 
%% 客户端
%% @end
%%---------------------------------------------------------------------------------
tcp_client (String) ->
	Host = "localhost",
	{ok, Socket} = gen_tcp:connect(Host, 2345, [binary, {packet, 1}]),
	gen_tcp:send(Socket, erlang:term_to_binary(String)),
	receive
		{tcp, Socket, Bin} ->
			io:format("Client receive binary is : ~p~n", [Bin]),
			Str = erlang:binary_to_term(Bin),
			io:format("Client receive String is :~p~n", [Str]),
			gen_tcp:close(Socket)
	end.

三、并发服务端(每当gen_tcp:accept收到一个新连接时立即分裂一个新进程)

%%---------------------------------------------------------------------------------
%% @doc 
%% 服务器,并发版
%% @end
%%---------------------------------------------------------------------------------
tcp_server_concurrency () ->
	{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 1}]),
	erlang:spawn(fun()->concurrency(Listen) end).
concurrency(Listen) ->
	{ok, Socket} = gen_tcp:accept(Listen),
	erlang:spawn(fun()->concurrency(Listen) end),
	loop(Socket).
loop (Socket) ->
	receive %%-----消息接受一次就没有,所以要loop
		{tcp, Socket, Bin} ->
			io:format("tcp_server_concurrency receive binary is : ~p~n", [Bin]),
			Str = binary_to_term(Bin),
			io:format("tcp_server_concurrency receive string is : ~p~n", [Str]),
			gen_tcp:send(Socket, erlang:term_to_binary(Str)),
			loop(Socket);
		{tcp_closed, Socket} ->
			io:format("tcp_server_concurrency Socket closed~n")
	end.

%%---------------------------------------------------------------------------------
%% @doc 
%% 客户端
%% @end
%%---------------------------------------------------------------------------------
tcp_client (String) ->
	Host = "localhost",
	{ok, Socket} = gen_tcp:connect(Host, 2345, [binary, {packet, 1}]),
	gen_tcp:send(Socket, erlang:term_to_binary(String)),
	receive
		{tcp, Socket, Bin} ->
			io:format("Client receive binary is : ~p~n", [Bin]),
			Str = erlang:binary_to_term(Bin),
			io:format("Client receive String is :~p~n", [Str]),
			gen_tcp:close(Socket)
	end.
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值