[Erlang脚印 0003] gen_tcp

常用的gen_tcp用到的函数:

gen_tcp:listen(Port, Options) -> {ok, ListenSocket}|{error, Reason} //监听端口

Options: 

{active, true}:创建一个主动套接字;当数据到达时候,控制进程会发送{tcp, Socket, Data}消息, 无法控制客户端的发送量,有导致服务器来不及处理消息的风险。

{active, false}: 创建一个被动套接字;控制进程必须调用gen_tcp:recv(Socket, N)来接收来自于套接字的数据,可以控制客户端的发送量。

{active, once}: 创建一个主动套接字, 但是只接收一条消息,如果需要接收下一条消息,必须再激活它。

inet:setopts(Socket, Options) -> ok|{error, posix()} //设置socket的一些属性

inet:peername(Socket) -> {ok, {IP_Address, Port}}| {error, Why} //返回的是客户端的IP地址和端口号,{N1,N2,N3,N4} 代表IPV4,{K1,K2,K3,K4,K5,K6,K7,K8}代表IPV6。

gen_tcp:accept(ListenSocket) -> {ok, Socket}|{error,Reason}  //接收来自客户端的socket链接

gen_tcp:connect(Address, Port, Options) -> {ok, Socket}|{error, Reason}  // 连接socket服务器

gen_tcp:send(Socket, Packet) -> ok | {error, Reason}  // 发送数据

gen_tcp:close(Socket) -> ok   // 关闭Socket

gen_tcp:shutdown(Socket, How) -> ok|{error, Reason}  // 关闭socket

 

构建一个简易的Tcp Socket通讯

1 -module(tcp_socket1).                                                           
  2 -compile(export_all).                                                           
  3                                                                                 
  4 start_server() ->                                                               
  5     start_server(6000).                                                         
  6                                                                                 
  7 start_server(Port) ->                                                           
  8     {ok, ListenSocket} = gen_tcp:listen(Port, [binary,{packet, 0}, {active, true}]),
  9     io:format("Server is running ....."),                                       
 10     par_connect(ListenSocket).                                                  
 11                                                                                 
 12 par_connect(Listen) ->                                                          
 13     {ok, Socket} = gen_tcp:accept(Listen),                                      
 14     spawn(fun() -> par_connect(Listen) end),                                    
 15     loop(Socket).                                                               
 16                                                                                 
 17 loop(Socket) ->                                                                 
 18     receive                                                                     
 19         {tcp, Socket, Data} ->                                                  
 20             io:format("Server receive binary:~p~n", [Data]),                    
 21             RecStr = binary_to_term(Data),                                      
 22             io:format("Server receive binary_to_term:~p~n", [RecStr]),          
 23             gen_tcp:send(Socket,term_to_binary(RecStr)),                        
 24             io:format("Server send to client binary:~p~n", [term_to_binary(RecStr)]),
 25             loop(Socket);                                                       
 26         {tcp_closed, Socket} ->                                                 
 27             io:format("Client socket closed")                                   
 28     end.                                                                        
 29                                                                                 
 30 start_client() ->                                                               
 31     start_client("localhost", 6000).                                            
 32                                                                                                                                                                                    
 33 start_client(Address, Port) ->                                                   
 34     {ok, Socket} = gen_tcp:connect(Address, Port, [binary, {packet, 0}, {active, true}]),
 35     ok = gen_tcp:send(Socket, term_to_binary("Nice to meeet you!")),            
 36     receive                                                                     
 37         {tcp, Socket, Data} ->                                                  
 38             io:format("Client receive binary:~p~n", [Data]),                    
 39             RecStr = binary_to_term(Data),                                      
 40             io:format("Cleint receive binary_to_term:~p~n", [RecStr]),          
 41             gen_tcp:close(Socket)                                               
 42     end.                                                                        
 43                                          

打开两个客户端分别运行服务器和客户端。

服务器窗口显示的信息:

Eshell V5.10.4  (abort with ^G)
1> c(tcp_socket1).
{ok,tcp_socket1}
2> tcp_socket1:start_server().
Server is running .....Server receive binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,101,101,
                        101,116,32,121,111,117,33>>
Server receive binary_to_term:"Nice to meeet you!"
Server send to client binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,
                               101,101,101,116,32,121,111,117,33>>
Client socket closedok
Server receive binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,101,101,
                        101,116,32,121,111,117,33>>
Server receive binary_to_term:"Nice to meeet you!"
Server send to client binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,
                               101,101,101,116,32,121,111,117,33>>
Client socket closedServer receive binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,101,101,
                        101,116,32,121,111,117,33>>
Server receive binary_to_term:"Nice to meeet you!"
Server send to client binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,
                               101,101,101,116,32,121,111,117,33>>
Client socket closed3> 

客户端窗口显示的信息:

4> tcp_socket1:start_client().
Client receive binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,101,101,
                        101,116,32,121,111,117,33>>
Cleint receive binary_to_term:"Nice to meeet you!"
ok
5> tcp_socket1:start_client().
Client receive binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,101,101,
                        101,116,32,121,111,117,33>>
Cleint receive binary_to_term:"Nice to meeet you!"
ok
6> tcp_socket1:start_client().
Client receive binary:<<131,107,0,18,78,105,99,101,32,116,111,32,109,101,101,
                        101,116,32,121,111,117,33>>
Cleint receive binary_to_term:"Nice to meeet you!"
ok
7> 

 

转载于:https://www.cnblogs.com/hanbird/p/3837280.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值