Erlang_Demo

本文展示了一个使用Erlang语言编写的简单socket测试程序。该程序通过创建多个并发线程来模拟客户端连接到指定IP地址和端口的服务器,并发送预定义的消息。每个线程会尝试发送固定数量的消息,并接收响应,以验证连接的有效性和数据传输的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//socket基本应用
//erlang程序基本写法
-module(vpl).
-export[(run/2)].

-define(IP,"127.0.0.1").
-define(PORT,1777).

run(ThreadCount,MsgCount)->
CurrentThreadNo = -1,
CurrentMsgNo = -1,
swpan_thread(CurrentThreadNo,CurrentMsgNo,ThreadCount,MsgCount).

swpan_thread(CurrentThreadNo,CurrentMsgNo,ThreadCount,MsgCount)->
NewThreadNo = CurrentThreadNo + 1,
if
NewThreadNo == ThreadCount ->
ok;
NewThreadNo < ThreadCount ->
RetryCount = 3,
spawn(fun() ->
connect_vsp(NewThreadNo,MsgCount,RetryCount)
end),
swpan_thread(NewThreadNo,CurrentMsgNo,ThreadCount,MsgCount)
end.

connect_vsp(NewThreadNo,MsgCount,RetryCount)->
case gen_tcp:connect(?IP,?PORT,[binary]) of
{ok,Socket} ->
io:fwrite("connect success! ThreadNo=~w~n",[NewThreadNo]),
TransId = 0,
send_msg(Socket,MsgCount,TransId,NewThreadNo);
{error,Reason} ->
io:fwrite("connect failed Error=~s,ThreadNo=~w~n !",[Reason,NewThreadNo]),
NewRetryCount = RetryCount - 1,
if
NewRetryCount > 0 ->
io:fwrite("reconnect ThreadNo=~w,RetryTime=~w~n",[NewThreadNo,NewRetryCount]),
connect_vsp(NewThreadNo,MsgCount,NewRetryCount);
NewRetryCount == 0 ->
io:fwrite("reconnect ThreadNo=~w Reach Retry Max! ~n",[NewThreadNo])
end
end.

send_msg(Socket,MsgCount,TransId,NewThreadNo)->
MsgContentBin = <<"TestContent">>,
Len = string:len(binary_to_list(MsgContentBin)),
%%packet head
MsgType = 16#222,
Version=1,
ReserveInt=0,

SendMsg = binary_to_list(<<Len:32,MsgType:16,Version:16,ReserveInt:32,>>) ++ binary_to_list(MsgContentBin),

if
MsgCount == 0 ->
ok = gen_tcp:close(Socket),
io:fwrite("test over ThreadNo=~w~n",[NewThreadNo]);
MsgCount > 0 ->
NewMsgCount = MsgCount - 1,
NewTransId = TransId + 1,
case gen_tcp:send(Socket,SendMsg) of
ok ->
receive_data(Socket,NewMsgCount,NewTransId,NewThreadNo);
{error,Reason}->
io:fwrite("send failed ~s~n !",[Reason])
end
end.

receive_data(Socket,NewMsgCount,NewTransId,NewThreadNo) ->
receive
{tcp,Socket,Bin} ->
<<RecvLen:32,MsgType:16,_/binary>> = Bin,
io:fwrite("~w ~.16B ~n",[RecvLen,RecvMsg]),
send_msg(Socket,NewMsgCount,NewTransId,NewThreadNo);
{tcp_closed,Socket}->
io:fwrite("close~n")
end.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值