% 原文 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).