erlang使用tcp的简单过程

       上次提到了gen_tcp那么记录一下操作流程(关于没有涉及到的方法还是自己看看帮助文档的注解

       首先,我们想要我们的tcp怎么工作,第一我们需要选取一个端口来进行tcp的传输,我们需要监听这个端口,我们使用gen_tcp模块的listen方法:

listen(Port, Options) -> {ok, ListenSocket} | {error, Reason}

       接下来我们接收到了连接的请求,我们就会调用accept方法来进行进行接收

 

accept(ListenSocket) -> {ok, Socket} | {error, Reason}

accept(ListenSocket, Timeout) -> {ok, Socket} | {error, Reason}

       如果我们有东西要发给客户端那么我们使用send方法

 

send(Socket, Packet) -> ok | {error, Reason}

       如果们所有的连接都停止了我们该使用什么方法呢

 

close(Socket) -> ok | {error, Reason}

       这里有一个方法,文档单纯翻译是

       为Socket指定一个新的控制进程的Pid,这个进程接收该socket发来的消息,如果该socket被除了控制进程外的其他进程所调用的话,那么返回error,(我们怎么去理解这个问题,下面我们会以游戏的角度来做比喻开始描述

controlling_process(Socket, Pid) -> ok | {error, Reason}

       目前为止,我们心里已经知道了什么时候使用什么方法,但是我们还是不知道该如何搭建tcp的连接

       假设现在有10个玩家,要开始游戏,首先要做的就是登陆游戏,假如一个玩家开始了登陆流程,那么我们就开始接受并处理这个玩家发来的消息,但是如果这个时候又一个玩家登陆游戏,我们该怎么做,假设一个进程来处理两个甚至更多玩家的行为,那么因为阻塞关系势必导致一个严重的问题,就是延迟会相当的高那么我们怎么办,我们想的是让一个进程去处理一个socket,也就是说一个进程处理一个玩家的消息,这里我们就会想到我们必须要使用监督者模式,这个时候我们就会用到controlling_process(Socket, Pid)来将新的Socket连接绑定到固定的一个进程上

      

{ok, ChildPid} = supervisor:start_child(tcp_client_sup, []),

		ok = gen_tcp:controlling_process(Sock, ChildPid),

       现在我们想好了思路,需要使用一个监督进程来管理我们所有处理不同玩家socket的进程,接下来就很明朗的,我们去写一个tcp_app.erl利用一个application去集中处理tcp操作,基本的文件格式为

listen_sup.erl       这里生成一个监听进程,并且生成一个处理监督进程
listen_op.erl        监听连接并生成一个接收进程,接收到一个新的连接,就生成一个新的接收进程
accept_sup.erl       生成子接收进程(归listen_sup管理)
accept_op.erl        为生成一个处理消息进程并将其绑定到Socket()
client_sup.erl       生成一个新的处理进程
client_op.erl        处理接收到的消息

       这样每个玩家的套接字,都有一个单独的进程来处理这样,我们就不会出现延迟的问题,一般情况下,我们都会启动一个单独的节点作为门户节点gate,然后这里处理各类消息问题!

       在处理套接字消息的时候,我们会很好奇一个问题,我们无法使用cast 或者 call来进行连接,那么我们又如何使用gen_server等固定的框架呢?在gen_server里就已经说过handle_info()是我们处理一切消息调用的时候的回调方法,同样的,套接字的消息处理我们也可以在handle_info回调处理!

      

你可能感兴趣的:(erlang)