• [erlang] gen_tcp传输文件原型(二进制)


     1 -module(tcp).
     2 -export([client/3,server/1]).
     3 
     4 client(Port,SiteID,Deploy) ->
     5     Host = "localhost",
     6     DeployBin = list_to_binary(Deploy),
     7     {ok,Sock} = gen_tcp:connect(Host,Port,[binary,{packet,4}]),
     8     ok = gen_tcp:send(Sock,<<SiteID:32,DeployBin/binary>>),
     9     receive_data(Sock,[],SiteID,Deploy).
    10 
    11 receive_data(Socket,SoFar,SiteID,Deploy) ->
    12     receive
    13         {tcp,Socket,<<"error",Msg/binary>>} ->
    14             io:format("~p~p~p~n",[binary_to_list(Msg),SiteID,Deploy]);
    15         {tcp,Socket,<<"success",Data/binary>>} ->
    16             Target = "/tmp/"++ integer_to_list(SiteID) ++ "-" ++ Deploy ++ ".tar",
    17             case file:write_file(Target,Data) of
    18                 ok             -> ok;
    19                 {error,Reason} -> io:format("~p~n",[Reason])
    20             end;
    21         {tcp,Socket,_Bin} ->
    22             %%receive_data(Socket,[Bin|SoFar],SiteID,Deploy);
    23             io:format("test");
    24         {tcp_closed,Socket} ->
    25 %            case lists:reverse(SoFar) of
    26 %                <<"error",Msg/binary>>  ->
    27 %                    {error,binary_to_list(Msg)};
    28 %                <<"success",Data/binary>> ->
    29 %                    Target = "/tmp/"++ SiteID ++ "-" ++ Deploy ++ ".tar",
    30 %                    file:write_file(Target,list_to_binary(Data),
    31 %                    {ok,Target};
    32 %                _                   ->
    33 %                    {error,unknown}
    34 %            end
    35             io:format("~p~n",[SoFar])
    36     end.
    37 
    38 server(Port) ->
    39     case gen_tcp:listen(Port,[binary,{packet,4}, %% 每个应用程序消息都从一个4字节长的头部开始
    40                                        {reuseaddr,true},  %% 
    41                                        {active,true}]) of
    42         {ok,Listen} ->
    43             spawn(fun()-> connect(Listen) end);
    44         {error,Why} ->
    45             io:format("~p~n",[Why])
    46     end.
    47 
    48 connect(Listen) ->
    49     case gen_tcp:accept(Listen) of %% 等待暂停并等待一个连接
    50         {ok,Socket} ->
    51             spawn(fun() -> connect(Listen) end),
    52             loop(Socket);
    53         {error,Why} ->
    54             io:format("~p~n",[Why])
    55     end.
    56 
    57 loop(Socket) ->
    58     receive
    59         %% 传入正确的二进制格式
    60         {tcp,Socket,<<SiteID:32,DeployBin/binary>>} ->
    61             Deploy = binary_to_list(DeployBin),
    62             Filename = "/tmp/scm/" ++ integer_to_list(SiteID) ++ "-" ++ Deploy ++ ".tar",
    63             T = case file:read_file(Filename) of
    64                 {ok,Bin1} ->
    65                     <<"success",Bin1/binary>>;
    66                 {error,Reason} ->
    67                     RBin = list_to_binary(atom_to_list(Reason)),
    68                     <<"error",RBin/binary>>
    69             end,
    70             gen_tcp:send(Socket,T),
    71             gen_tcp:close(Socket);
    72         {tcp,Socket,_Bin}   ->
    73             Msg = list_to_binary("illegal format"),
    74             gen_tcp:send(Socket,[<<"error",Msg/binary>>]),
    75             gen_tcp:close(Socket);
    76         {tcp_closed,Socket} ->
    77             io:format("Server socket closed~n")
    78     end.

    http://www.cnblogs.com/bluefrog/archive/2012/09/10/2679040.html 改进版加入了一些二进制处理

    改一改还能写个二进制包处理的游戏服务器, 就可以开搞游戏了... 慢慢来咯

  • 相关阅读:
    Java主流日志工具库
    JSON 与 String、Map、JavaBean互转
    Session超时处理
    spring cron表达式(定时器)
    Windows服务器下用IIS Rewrite组件为IIS设置伪静态方法
    JAVA导出Excel(支持多sheet)
    自己实现一个简单的线程池
    数据库
    计算机网络
    HashMap源码分析
  • 原文地址:https://www.cnblogs.com/bluefrog/p/2685143.html
Copyright © 2020-2023  润新知