Erlang 编程之socket 单用户客户端通讯

来源:互联网 发布:ibm的人工智能 编辑:程序博客网 时间:2024/05/16 01:18

% 原文 http://blog.csdn.net/d_watson/article/details/6745479
% 修改:zidai78123@163.com
% 转载请注明原文出处
%

Erlang TCP/Socket编程Demo


初学erlang,找了很久的资料,发现一个Socket的单文件例子。可以进行客户端和服务器端通讯

该实例包括一个tcp_test.erl文件,很小,但是内容很全,适合刚入门的朋友看看,:

-module(tcp_test) 单个文件。
start_server()   %开启服务 监听127.0.0.1:9999端口
client()   % 测试socket通信
message_tcp("message")  % 带内容的socket 测试接口函数

本人也是初学Erlang,本程序技术层级较低。高手可以直接飘过。

 

erlang 的 socket服务框架:


client()
  //gen_tcp:connect() 连接端口
  //gen_tcp:send()    send message.
  //gen_tcp:recv()    recvieve message.
  //gen_tcp:close(Socket)   close prosess.

start_server()
  //gen_tcp:listen()  监听端口
  //gen_tcp:accept(ListenSocket) 接受

  //and其他

 

---------------------------------
---------------------------------
Server端结果:
D:\temp\socket>erl
Eshell V5.9.1  (abort with ^G)
1> c(tcp_test).
{ok,tcp_test}
2> tcp_test:start_server().
received request message <<"erlang client sending message">>
socket close
ok


Erlang client 端结果:[/b]
D:\temp\socket>erl
Eshell V5.9.1  (abort with ^G)
1> tcp_test:client().
result: <<"process successful">>
ok
2> tcp_test:message_tcp("this is the first tcp_tes at").
result: <<"process successful">>
ok

 

源码

tcp_test.erl

--------------------------------

-module(tcp_test).
-export([start_server/0, client/0, message_tcp/1, accept/1]).

start_server()->
    {ok, ListenSocket}=gen_tcp:listen(9999,[binary,{active,false}]),
    accept(ListenSocket).
   
accept(ListenSocket)->
    {ok,Socket} = gen_tcp:accept(ListenSocket),
    spawn(?MODULE, accept,[ListenSocket]),
    process_request(Socket).
   
process_request(Socket)->
    case gen_tcp:recv(Socket,0,5000) of
        {ok,Binary}->
            io:format("received request message ~p~n", [Binary]),
            gen_tcp:send(Socket, "process successful"),
            process_request(Socket); %尾递归,No死循环
        {error, closed}->
            io:format("socket close ~n");
        _Req->
            io:format("receive ~p~n", [_Req])
    end.
   
client()->
    {ok,Socket}=gen_tcp:connect({127,0,0,1},9999,[binary,{packet,0},{active,false}]),
    gen_tcp:send(Socket, "erlang client sending message"),
    case gen_tcp:recv(Socket,0,5000) of
        {ok,Binary}->
            io:format("result: ~p~n", [Binary]);
        _Req->
            io:format("unknow receive ~p~n", [_Req])
    end,
    ok = gen_tcp:close(Socket).

message_tcp(X)->
    {ok,Socket}=gen_tcp:connect({127,0,0,1},9999,[binary,{packet,0},{active,false}]),
    gen_tcp:send(Socket, X),
    case gen_tcp:recv(Socket,0,5000) of
        {ok,Binary}->
            io:format("result: ~p~n", [Binary]);
        _Req->
            io:format("unknow receive ~p~n", [_Req])
    end,
    ok = gen_tcp:close(Socket).