/msv.erl

http://github.com/witwang/ESS · Erlang · 197 lines · 137 code · 31 blank · 29 comment · 4 complexity · d2945f19482bebcff473dbfd1cfdb532 MD5 · raw file

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %% ·Ö·¢·þÎñÆ÷
  3. %% 2345Ë¿Ú¸ºÔðÁ¬½Óclient£¬ clientÁ¬½ÓÉÏÖ®ºó£¬µÈ´ýserver·¢ËÍÏûÏ¢
  4. %% 2346Ë¿Ú¸ºÔðÁ¬½ÓÏûÏ¢²úÉú³ÌÐò£¬½ÓÊÕÏûÏ¢£¬È»ºóת·¢¸øËùÓеÄcient
  5. %% msv:start(). Æô¯·þÎñÆ÷¡£
  6. %% msv:client_connect("abcd"). ¿Í»§ËÁ´½Ó¡£
  7. %% msv:sms_send("U:444", term_to_binary("haha")). ¡£
  8. %% Socket_sms = msv:sms_connect(). ÏûÏ¢ËÁ´½Ó¡£
  9. %% msv:message_send(Socket_sms, "abcd"). ·¢ËÍÏûÏ¢º¯Êý
  10. %% msv:message_send("abcd"). ·¢ËÍÏûÏ¢º¯Êý
  11. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  12. -module(msv).
  13. -export([start/0, sms_send/1, sms_send/2]).
  14. -export([sms_connect/0, message_send/2, message_send/1, message_u_send/3, message_u_send/2]).
  15. -export([client_connect/1]).
  16. -export([test/2]).
  17. %% Æô¯·þÎñÆ÷£¨³õʼ»¯Á´½ÓÁÐ±í¡¢´´½¨¿Í»§Ë¼àÌýË¿Ú£¬´´½¨ÏûϢ˼àÌýË¿Ú£©
  18. start() ->
  19. init(),
  20. start_cient_listen(),
  21. start_sms_listen().
  22. %%³õʼ»¯£¬ÉèÖÃÁ´½ÓÁбí
  23. init() ->
  24. Pid = spawn(fun() -> linklist_create() end),
  25. register(linklist, Pid).
  26. %%´´½¨Á´½ÓÁбí
  27. linklist_create() ->
  28. ets:new(tab_p_u, [set, protected, named_table]),
  29. ets:new(tab_u_p, [set, protected, named_table]),
  30. linklist_change().
  31. linklist_change() ->
  32. receive
  33. {add, Pid, User} ->
  34. ets:insert(tab_p_u, {Pid, User}),
  35. ets:insert(tab_u_p, {User, Pid}),
  36. linklist_change();
  37. {del, Pid} ->
  38. [{Pid, User}] = ets:lookup(tab_p_u, Pid),
  39. ets:delete(tab_p_u, Pid),
  40. ets:delete(tab_u_p, User),
  41. linklist_change()
  42. end.
  43. %%¿ªÆôclientµÄ¼àÌý
  44. start_cient_listen() ->
  45. {ok, Listen_c} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true}, {active, once}]),
  46. spawn(fun() -> client_content(Listen_c) end),
  47. spawn(fun() -> client_content(Listen_c) end),
  48. spawn(fun() -> client_content(Listen_c) end),
  49. spawn(fun() -> client_content(Listen_c) end),
  50. spawn(fun() -> client_content(Listen_c) end),
  51. spawn(fun() -> client_content(Listen_c) end),
  52. spawn(fun() -> client_content(Listen_c) end),
  53. spawn(fun() -> client_content(Listen_c) end),
  54. spawn(fun() -> client_content(Listen_c) end),
  55. spawn(fun() -> client_content(Listen_c) end),
  56. io:format("cient_listen ok ~n").
  57. client_content(Listen_c) ->
  58. {ok, Socket} = gen_tcp:accept(Listen_c),
  59. spawn(fun() -> client_content(Listen_c) end),
  60. client_loop(Socket).
  61. client_loop(Socket) ->
  62. receive
  63. {tcp, Socket, Bin} ->
  64. inet:setopts(Socket, [{active, once}]),
  65. Str = binary_to_term(Bin),
  66. %io:format("regiest uid ~p~n", [Str]),
  67. linklist ! {add, self(), Str},
  68. %gen_tcp:send(Socket, term_to_binary([Str, " ok"])),
  69. client_loop(Socket);
  70. {tcp_closed, Socket} ->
  71. %io:format("cient close ~n"),
  72. linklist ! {del, self()};
  73. {message, Bin} ->
  74. %io:format("send message ~n"),
  75. gen_tcp:send(Socket, Bin),
  76. client_loop(Socket)
  77. end.
  78. %%¿ªÆôSMSµÄ¼àÌý
  79. start_sms_listen() ->
  80. {ok, Listen_s} = gen_tcp:listen(2346, [binary, {packet, 4}, {reuseaddr, true}, {active, once}]),
  81. spawn(fun() -> sms_content(Listen_s) end),
  82. spawn(fun() -> sms_content(Listen_s) end),
  83. io:format("sms_listen ok ~n").
  84. sms_content(Listen_s) ->
  85. {ok, Socket} = gen_tcp:accept(Listen_s),
  86. spawn(fun() -> sms_content(Listen_s) end),
  87. sms_loop(Socket).
  88. sms_loop(Socket) ->
  89. receive
  90. {tcp, Socket, Bin} ->
  91. inet:setopts(Socket, [{active, once}]),
  92. case binary_to_term(Bin) of
  93. {User, Msg} -> sms_send(User, term_to_binary(Msg));
  94. _ -> sms_send(Bin)
  95. end,
  96. sms_send(Bin),
  97. sms_loop(Socket);
  98. {tcp_closed, Socket} ->
  99. io:format("sms close ~n")
  100. end.
  101. %ÔËùÓÐÓû§·¢ËÍÏûÏ¢ Bin£¨þ½øÖƸñʽ£©
  102. sms_send(Bin) ->
  103. L = ets:tab2list(tab_p_u),
  104. lists:foreach( fun({Pid,_}) -> Pid ! {message, Bin} end, L).
  105. %Ô User Óû§·¢ËÍÏûÏ¢ Bin£¨þ½øÖƸñʽ£©
  106. sms_send(User, Bin) ->
  107. case ets:lookup(tab_u_p, User) of
  108. [{User, Pid}] -> Pid ! {message, Bin};
  109. [] -> io:format("no user ~p~n", [User])
  110. end.
  111. %%%%%%%%²âÊÔ´úÂë%%%%%%%%
  112. %%%%%%%%%%client%%%%%%%%%%%%%%%%%
  113. %¿Í»§ËÁ¬½Ó£¬ Str²ÎÊýÊÇ Óû§ID
  114. client_connect(Str) ->
  115. {ok, Socket} = gen_tcp:connect("127.0.0.1", 2345, [binary, {packet, 4}]),
  116. ok = gen_tcp:send(Socket, term_to_binary(Str)),
  117. client_revieve_loop(Socket).
  118. client_revieve_loop(Socket) ->
  119. receive
  120. {tcp, Socket, _} ->
  121. io:format("client recieve binary = ~p~n", [Bin]),
  122. Val = binary_to_term(Bin),
  123. io:format("Client result = ~p~n", [Val]),
  124. client_revieve_loop(Socket)
  125. end.
  126. %%%%%%%%%%sms%%%%%%%%%%%%%%%%%
  127. %ÏûÏ¢·þÎñÆ÷Á¬½Ó
  128. sms_connect() ->
  129. {ok, Socket} = gen_tcp:connect("127.0.0.1", 2346, [binary, {packet, 4}]),
  130. Socket.
  131. %ÏûÏ¢·þÎñÆ÷Á¬½Ó
  132. message_send(Socket, Str) ->
  133. ok = gen_tcp:send(Socket, term_to_binary(Str)).
  134. message_send(Str) ->
  135. {ok, Socket} = gen_tcp:connect("127.0.0.1", 2346, [binary, {packet, 4}]),
  136. ok = gen_tcp:send(Socket, term_to_binary(Str)),
  137. gen_tcp:close(Socket).
  138. message_u_send(User, Str) ->
  139. {ok, Socket} = gen_tcp:connect("127.0.0.1", 2346, [binary, {packet, 4}]),
  140. ok = gen_tcp:send(Socket, term_to_binary({User, Str})),
  141. gen_tcp:close(Socket).
  142. message_u_send(Socket, User, Str) ->
  143. ok = gen_tcp:send(Socket, term_to_binary({User, Str})).
  144. %¿ªÆôà¸ö¿Í»§ËÁ´½Ó C:²¢·¢Êý P:ÿ¸ö²¢·¢Á´½ÓÒª´ò¿ªÁ´½ÓµÄÊýÁ¿
  145. test(C, P) ->
  146. io:format("test starting~n"),
  147. statistics(wall_clock),
  148. for(0, C, P).
  149. for(Max, Max, _) ->
  150. io:format("start thread ~p~n", [Max]);
  151. for(First, Max, P) ->
  152. spawn(fun() -> test_connect( First, 1, P) end),
  153. for(First + 1, Max, P).
  154. test_connect(First, Second, Count) ->
  155. {ok, Socket} = gen_tcp:connect("127.0.0.1", 2345, [binary, {packet, 4}]),
  156. U1 = string:concat("U:", erlang:integer_to_list(First)),
  157. U2 = string:concat(":", erlang:integer_to_list(Second)),
  158. U = string:concat(U1, U2),
  159. ok = gen_tcp:send(Socket, term_to_binary(U)),
  160. case Second < Count of
  161. true -> spawn(fun() -> test_connect( First, Second+1, Count) end);
  162. false ->
  163. {_, Time} = statistics(wall_clock),
  164. io:format("finish thread ~p(~p)~n", [First, Time])
  165. end,
  166. client_revieve_loop(Socket).