[Erlang 学习笔记] erlang socket 小小 demo

server端代码:

-module(server).
-export([start/0]).
-export([stop/1]).

start()->
{ok,Listen}=gen_tcp:listen(8888, %%socket监听的端口
[binary, %%socket传输格式 binary:二进制 list:字符列表
{packet,4}, %%有关对二进制包的解包
{reuseaddr,true}, %%reuse address 复用连接过的ip地址??
{active,true}]), %%{active ,true|false|once}被动或主动或一次接收信息
{ok,Socket}=gen_tcp:accept(Listen), %%接收发送至已监听端口的信息
do(Socket,Listen). %%自定义处理

do(Socket,Listen)->
receive
{tcp,Socket,Message}-> %%匹配时注意关键atom:tcp和tcp_close(建立的是基于tcp的socket)

A=binary_to_term(Message), %%格式的转换

gen_tcp:send(Socket,term_to_binary(A));
{tcp_closed,Socket}->
stop(Listen),
io:format("close ~n",[])
end.

stop(Listen)->
gen_tcp:close(Listen),
io:format("server close listen ~n",[]).


        在创建socket监听的时候,有这么个配置 {active,true},这参数的意思是自动接收信息,配合gen_tcp:accept使用。但这种非阻塞接收方式会出现一种现象:信息如洪水涌来,给server造成一定压力,处理不及还会丢包。所以还有另一种接收方式,主动请求接收信息(阻塞):配置{active,false|once},配合gen_tcp:accept和gen_tcp:recv还有setopt({active,once})使用,由server去控制接收信息.



client端:

-module(client).

-export([sendMessage/1,sendClose/0,waitAply/1]).

sendMessage(Message)->
{ok,Socket}= gen_tcp:connect("localhost",8888,[binary,{packet,4}]),%%连接
gen_tcp:send(Socket,term_to_binary(Message)),%%发送
B=term_to_binary(Message),
io:format("client send ~w to server~n",[B]),

sendClose()->
{ok,Socket}= gen_tcp:connect("localhost",8888,[list,{packet,4}]),
gen_tcp:close(Socket),%%关闭socket的时候会向连接的端口发送close信息,server捕获处理。
io:format("client send close to server ~n",[]).


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值