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

本文介绍了Erlang中使用TCP/Socket进行客户端和服务器通信的简单示例,包括`start_server()`启动服务,`client()`进行连接通信,以及`message_tcp/1`发送带有内容的socket消息。示例代码展示了如何使用gen_tcp模块进行监听、接受、发送和接收数据。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值