实现erlang聊天室(服务器跟客户端互发)

服务器

%% @author 
-module(aa_server).
-export([start_server/0,loop/1,server_send/1]).

start_server()->
	%%创建ets表 
	ets:new(tcpname, [set,public,named_table]),
	{ok,Listen} = gen_tcp:listen(2345, [binary,{packet,4},{reuseaddr,true},{active,true}]),
	spawn(fun() -> par_contect(Listen) end).

%%连接
par_contect(Listen) ->
	{ok,Socket}=gen_tcp:accept(Listen),
	ets:insert(tcpname, {socket,Socket}),
	spawn(fun() -> par_contect(Listen) end),
	Pid=spawn(fun() -> loop(Socket) end),
	gen_tcp:controlling_process(Socket, Pid).

%%server端发送信息
server_send(Str)->
	Socket=ets:lookup_element(tcpname,socket,2),
	gen_tcp:send(Socket, term_to_binary(Str)),
	io:format("server say to client ~p~n",[Str]).

loop(Socket) ->
	receive
		{tcp,Socket,Bin} ->
			Str = binary_to_term(Bin),
			io:format("from Server receive ~p~n",[Str]),
			loop(Socket);
		{tcp_closed,Socket}-> 
			io:format("from Server closed ~n")
	end.

客户端

%% @author 
-module(bb_client).
-export([client_send/1,loop/1,tcp/0]).
%%连接
tcp()->
	%%把socket保存进tcpname1表
	ets:new(tcpname1, [set,public,named_table]),
	{ok,Socket} = gen_tcp:connect("localhost", 2345,[binary, {packet, 4}]),
	ets:insert(tcpname1, {socket,Socket}),
	%%把socket的控制权交给loop函数
	Pid=spawn(fun() -> loop(Socket) end),
	gen_tcp:controlling_process(Socket, Pid).
%%客户端发送信息
client_send(Str) ->
	%%获得套接字
	Socket=ets:lookup_element(tcpname1,socket,2),
	%%  ets:new(tcpname1, [set,public,named_table]),
	gen_tcp:send(Socket, term_to_binary(Str)),
	%%  spawn(fun() -> loop(Socket) end),
	io:format("client say to server1111 ~p~n",[Str]).
%%循环开启接受信息
loop(Socket)->
	receive
		{tcp,Socket,Bin} ->
			Val = binary_to_term(Bin),
			io:format("from client receive ~p~n",[Val]),
			loop(Socket)
	end.

启动服务器  :aa_server:start_server().

连接客户端:bb_client:tcp().

然后就可以愉快的互怼了

bb_client:client_send("I am so  handsome").
aa_server:server_send("you are lie").

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值