• Erlang TCP 实例


    Server

    -module(server).
    
    -behaviour(gen_server).
    
    %% API
    -export([
             start_link/0,
             stop/0
             ]).
    
    %% gen_server callbacks
    -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
             terminate/2, code_change/3]).
    
    -define(PORT, 1234).
    -define(HOST, {127,0,0,1}).
    
    -record(state, {port, sock, count=0}).
    
    %%%===================================================================
    %%% Maintenance API
    %%%===================================================================
    
    
    start_link([Port]) ->
        gen_server:start_link({local, ?MODULE}, ?MODULE, [Port], []).
    start_link() ->
        start_link([?PORT]).
    
    stop() ->
        io:format("Stop"),
        gen_server:cast(?MODULE, stop).
    
    %%%===================================================================
    %%% Services API
    %%%===================================================================
    
    %%%===================================================================
    %%% gen_server callbacks
    %%%===================================================================
    
    init([Port]) ->
        {ok, Listen} = gen_tcp:listen(Port, [binary, {active, true}]),
        {ok, #state{port = Port, sock = Listen}, 0}.
    
    handle_call(Msg, _Form, State) ->
        io:format("~p~n",[Msg]),
        {reply, State}.
    
    handle_cast(stop, State) ->
        {stop, normal, State}.
    
    handle_info({tcp, Socket, RawData}, State) ->
    
        Term = binary_to_term(RawData),
        case Term of
            stop -> 
                gen_tcp:send(Socket, <<"Stop">>),
                stop();
            _ -> 
                io:format("~p~n", [Term]),
                gen_tcp:send(Socket, <<"Success">>)
        end,
        {noreply, State};
    
    handle_info(timeout, State) ->
        io:format("timeout"),
        {ok, _Sock} = gen_tcp:accept(State#state.sock),
        {noreply, State}.
    
    terminate(_Reason, _State) ->
        ok.
    
    code_change(_OldVsn, State, _Extra) ->
        {ok, State}.
    

    Client

    -module(server).
    
    -behaviour(gen_server).
    
    %% API
    -export([
             start_link/0,
             stop/0
             ]).
    
    %% gen_server callbacks
    -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
             terminate/2, code_change/3]).
    
    -define(PORT, 1234).
    -define(HOST, {127,0,0,1}).
    
    -record(state, {port, sock, count=0}).
    
    %%%===================================================================
    %%% Maintenance API
    %%%===================================================================
    
    
    start_link([Port]) ->
        gen_server:start_link({local, ?MODULE}, ?MODULE, [Port], []).
    start_link() ->
        start_link([?PORT]).
    
    stop() ->
        io:format("Stop"),
        gen_server:cast(?MODULE, stop).
    
    %%%===================================================================
    %%% Services API
    %%%===================================================================
    
    %%%===================================================================
    %%% gen_server callbacks
    %%%===================================================================
    
    init([Port]) ->
        {ok, Listen} = gen_tcp:listen(Port, [binary, {active, true}]),
        {ok, #state{port = Port, sock = Listen}, 0}.
    
    handle_call(Msg, _Form, State) ->
        io:format("~p~n",[Msg]),
        {reply, State}.
    
    handle_cast(stop, State) ->
        {stop, normal, State}.
    
    handle_info({tcp, Socket, RawData}, State) ->
    
        Term = binary_to_term(RawData),
        case Term of
            stop -> 
                gen_tcp:send(Socket, <<"Stop">>),
                stop();
            _ -> 
                io:format("~p~n", [Term]),
                gen_tcp:send(Socket, <<"Success">>)
        end,
        {noreply, State};
    
    handle_info(timeout, State) ->
        io:format("timeout"),
        {ok, _Sock} = gen_tcp:accept(State#state.sock),
        {noreply, State}.
    
    terminate(_Reason, _State) ->
        ok.
    
    code_change(_OldVsn, State, _Extra) ->
        {ok, State}.
    
  • 相关阅读:
    为什么不能获取PHP表单变量的?
    DOM4j读写XML(实例)
    MyEclipse环境的使用中的一些常识
    Springcloud学习笔记38springboot整合日志框架log4j2
    Springcloud学习笔记37任务调度框架Quartz 使用(Cron表达式)与@scheduled注解定时任务
    Linux学习笔记05linux 常用操作命令02(touch命令、cp命令、rm命令、mv命令)
    Linux学习笔记07Vim文本编辑器
    Java基础知识13Java反射原理以及基本使用和重写与重载的区别
    Linux学习笔记07常用操作命令(tar命令)
    Java基础知识14commonsio第3方开源库的具体使用(IOUtils类、FileUtils类、FilenameUtils类)
  • 原文地址:https://www.cnblogs.com/qq188380780/p/13502881.html
Copyright © 2020-2023  润新知