2.基础知识,Erlang gen_tcp 案例

1.客户端和服务端互联案例,举例中客户端和服务端都是用Erlang
服务端
 1 server() ->
 2     LSock = listen(), %监听本机的某个端口
 3     {ok, Sock} = gen_tcp:accept(LSock), %保持监听状态,程序会停在这一步,直到有客户端连接上
 4     {ok, Bin} = do_recv(Sock, []), %接收参数
 5     ok = gen_tcp:close(Sock), %关闭这个监听
 6     Bin.
 7 
 8 %%监听本机的5678端口,发送的数据超过4字节才被接收
 9 listen() ->
10     {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 4},
11                                         {active, false}]),
12     LSock.
13 
14 %%接收参数,两种情况
15 %%1.如果客户端一直发送消息,尾递归调用一直接收消息
16 %%2.如果客户端关闭连接,返回{ok, Data}
17 do_recv(Sock, Bs) ->
18     case gen_tcp:recv(Sock, 0) of
19         {ok, B} ->
20             do_recv(Sock, [Bs, B]);
21         {error, closed} ->
22             {ok, list_to_binary(Bs)}
23     end.


客户端
SomeHostInNet = "localhost", %%服务器IP
    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,
                                 [binary, {packet, 0}]), %连接上服务器,
    %%服务器端表现:
    %%1.在连接上服务器之前,服务端一直停在gen_tcp:accept(LSock),
    %%2.链接上服务器之后,服务端程序继续执行,
    %%3.执行到do_recv(Sock, []),又会处于监听状态(此时监听客户端发送的数据)

    ok = gen_tcp:send(Sock, "Some Data"), %发送数据,这一步可以发送很多消息

    ok = gen_tcp:send(Sock, "Some Data2"),

    ok = gen_tcp:send(Sock, "Some Data3"),
    %%服务端表现:服务端一直处于接收消息状态

    ok = gen_tcp:close(Sock). %关闭连接,此时服务端do_recv(Sock, [])执行完毕,继续往下执行gen_tcp:close(Sock)

 



posted @ 2014-09-26 11:14  余健  阅读(345)  评论(0编辑  收藏  举报