Erlang之一个简单的TCP服务器

本文介绍了如何使用Erlang编写一个简单的TCP服务器,包括顺序服务器和并行服务器的实现,并提供了客户端的交互示例,展示了Erlang在并发处理上的优势。

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

简单TCP服务器代码:

-module(my_socket_server).
-export([start/0,loop/1]).
start() ->
	{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},%自定义打包规则,生成一个监听2345端口的socket
													{reuseaddr, true},
													{active, true}]),
	{ok, Socket} = gen_tcp:accept(Listen),%生存一个新的Socket
	gen_tcp:close(Listen),%把该监听关闭,不再生成新的socket
	loop(Socket).

loop(Socket) ->
	receive
		{tcp, Socket, Bin} ->
			io:format("Server received binary = ~p~n",[Bin]),
			Str = binary_to_term(Bin),%解码
			io:format("Server (unpacked) ~p~n",[Str]),
			Reply = lib_misc:string2value(Str),
			io:format('Server replying = ~p~n',[Reply]),
			gen_tcp:send(Socket, term_to_binary(Reply)),%编码
			loop(Socket);
		{tcp_closed, Socket} ->
			io:format("Server socket close~n")
	end.

顺序服务器:

-module(my_socket_server2).
-compile(export_all).
start() ->
	{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},%自定义打包规则,生成一个监听2345端口的socket
													{reuseaddr, true},
													{active, true}]),
	seq_loop(Listen).

seq_loop(Listen) ->
	{ok, Socket} = gen_tcp:accept(Listen),
	loop(Socket),
	seq_loop(Listen).

loop(Socket) ->
	receive
		{tcp, Socket, Bin} ->
			io:format("Server received binary = ~p~n",[Bin]),
			Str = binary_to_term(Bin),%解码
			io:format("Server (unpacked) ~p~n",[Str]),
			Reply = lib_misc:string2value(Str),
			io:format('Server replying = ~p~n',[Reply]),
			gen_tcp:send(Socket, term_to_binary(Reply)),%编码
			loop(Socket);
		{tcp_closed, Socket} ->
			io:format("Server socket close~n")
	end.

并行服务器:

-module(my_socket_server3).
-compile(export_all).
start() ->
	{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},%自定义打包规则,生成一个监听2345端口的socket
													{reuseaddr, true},
													{active, true}]),
	spawn(fun() -> par_connect(Listen) end).

par_connect(Listen) ->
	{ok, Socket} = gen_tcp:accept(Listen),
	spawn(fun() -> par_connect(Listen) end),
	loop(Socket).

loop(Socket) ->
	receive
		{tcp, Socket, Bin} ->
			io:format("Server received binary = ~p~n",[Bin]),
			Str = binary_to_term(Bin),%解码
			io:format("Server (unpacked) ~p~n",[Str]),
			Reply = lib_misc:string2value(Str),
			io:format('Server replying = ~p~n',[Reply]),
			gen_tcp:send(Socket, term_to_binary(Reply)),%编码
			loop(Socket);
		{tcp_closed, Socket} ->
			io:format("Server socket close~n")
	end.

客户端:

-module(my_socket_client).
-compile(export_all).
start(Str) ->
	{ok, Socket} = 
		gen_tcp:connect('localhost', 2345,
					[binary, {packet, 4}]),
	ok = gen_tcp:send(Socket, term_to_binary(Str)),
	receive
		{tcp, Socket, Bin} ->
			io:format("Client receive binary = ~p~n",[Bin]),
			Val = binary_to_term(Bin),
			io:format("Client result = ~p~n",[Val]),
			gen_tcp:close(Socket)
		end.
-module(lib_misc).

-export([string2value/1]). 

string2value(L) -> string2value(L, []).
string2value([], N)    -> list_to_tuple(lists:reverse(N));
string2value([H|T], N) -> string2value(T, [H|N]).

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值