`
nuaa_liu
  • 浏览: 25388 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Erlang_Demo

阅读更多
//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.
	



0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics