zoukankan      html  css  js  c++  java
  • Erlang TCP Socket的接收进程的2种方案

    转自:http://blog.csdn.net/summerhust/article/details/8740973

    一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因为一个错误而终止。在建立一个连接时,一般为每一次请求产生一个新进程,只要有请求被处理,就保持这个进程的存活。

    假设有一个监听进程,其任务是等待传入的TCP请求。只要一个请求到达,响应该连接请求的进程就变成了接收进程,有2种方案:

    1. 产生新的进程并成为接收进程,而监听者返回并继续监听下一个新的连接请求:

    server() ->  

        {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {active, false}]),  

        wait_connect(ListenSocket,0).  

     wait_connect(ListenSocket, Count) ->  

        {ok, Socket} = gen_tcp:accept(ListenSocket),  

        Pid = spawn(?MODULE, get_request, [Socket, [], Count]),  

        %将该套接字的控制进程改为Pid进程  

        gen_tcp:controlling_process(Socket, Pid),  

        wait_connect(ListenSocket, Count+1).  

          

      

    get_request(Socket, BinaryList, Count) ->  

        case gen_tcp:recv(Socket, 0, 5000) of  

        {ok, Binary} ->  

            io:format("received data: ~p~n", [binary_to_list(Binary)]),  

            get_request(Socket, [Binary|BinaryList], Count);  

        {error, closed} ->  

            handle(lists:reverse(BinaryList), Count)  

        end.  

     

    2. 使监听进程成为接收进程,并使产生的新进程成为新的监听者:

     

    server() ->  

        {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {active, false}]),  

        wait_connect(ListenSocket,0). 

     

    wait_connect(ListenSocket, Count) ->  

        {ok, Socket} = gen_tcp:accept(ListenSocket),  

        spawn(?MODULE, wait_connect, [ListenSocket, Count+1]),  

        get_request(Socket, [], Count).  

     

    说明:

    (1)  创建一个套接字的进程(通过调用gen_tcp:accept或gen_tcp:connect)也就是该套接字的控制进程,该套接字所收到的任何消息都会转发给这个控制进程,如果控制进程消亡,那么该套接字也会自行关闭。我们可以通过gen_tcp:controlling_process(Socket, NewPid)函数来把一个套接字的控制进程改为新的控制进程NewPid;

    (2) gen_tcp:accept和gen_tcp:recv是阻塞的,可以用prim_inet:async_accept和prim_inet:async_recv实现非阻塞。

  • 相关阅读:
    [j2me]KSoap2在Nokia真机上可能导致SymbianOS error 28
    [J2ME]Nokia播放音乐时发生MediaException的解决办法
    [j2me]利用JLayerMECLDC0.2播放MP3的试验[1]
    [j2me]手机也可以玩播客(Podcast)! Geek开发说明[开源]
    [JavaME]手机申请移动分配的动态IP(3)?
    [流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[1][修正版,增加了带宽测试包]
    [JavaME]手机申请移动分配的动态IP(2)?
    [JavaME]手机是否能够申请到动态IP?
    [收藏]MIDlet如何签名的tutorial
    [流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[3]
  • 原文地址:https://www.cnblogs.com/ribavnu/p/3240435.html
Copyright © 2011-2022 走看看