`
做一行爱一行吧
  • 浏览: 23776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 tcp_server

    Erlang TCP服务器是用Erlang编程语言实现的一种网络通信服务,它允许程序通过TCP协议接收和发送数据。在Erlang中,构建TCP服务器通常涉及到以下关键知识点: 1. **Erlang OTP(Open Telecom Platform)**:Erlang ...

    基于Erlang的gen_tcp聊天室代码,功能完整

    gen_tcp是Erlang OTP(开放电信平台)提供的一种行为模块,它允许程序员以面向过程的方式处理TCP连接。gen_tcp提供了创建、监听、接受和关闭TCP套接字的函数,以及发送和接收数据的基本操作。 **Erlang的并发特性**...

    erlang websocket

    2. **Erlang实现Websocket**:在Erlang中,可以使用如`cowboy`或`mochiweb`这样的Web框架来处理Websocket连接。它们提供了方便的中间件,使得在Erlang进程中直接处理Websocket连接成为可能。例如,`cowboy`中的`...

    erlang 深度分析

    - **调试**: 使用调试工具逐步跟踪函数调用过程。 #### 25. Erlang测试案例编写 - **Common Test**: Erlang官方提供的测试框架。 - **Test Server**: 一种简单的测试服务器,用于模拟真实的服务环境。 - **应用...

    使用OTP原理构建一个非阻塞的TCP服务器

    在本文中,我们将探讨如何使用Erlang的OTP(Open Telecom Platform)原则构建一个非阻塞的TCP服务器。OTP为开发健壮、容错的应用提供了强大的框架,它包含了一系列行为模式,如gen_server和gen_fsm,这些模式可以...

    erlang学习1.pdf

    本文介绍了Erlang的基本安装流程、编写简单的Hello World程序以及实现一个TCP客户端的过程。此外,还涵盖了Erlang中的一些核心概念,如进程、消息传递、模式匹配和递归等。对于初学者来说,这些都是非常重要的知识点...

    erlang学习4.pdf

    - **远程过程调用(RPC)**: Erlang提供了简单的RPC机制,允许开发者在不同节点之间执行函数调用,从而简化了分布式系统的开发。 ##### 分布式TableServer 在Erlang中,TableServer是一种用于管理键值对的数据结构,...

    erlang高性能网络库esockd的编译和使用(三)

    `{socket, gen_tcp}`表示我们使用gen_tcp作为底层协议,`{active, once}`则意味着Erlang进程将只接收一次来自socket的数据,之后需要手动调用`esockd:recv/2`或`esockd:recv/3`来接收更多数据。 对于服务器端,我们...

    barrel_tcp:bucket_tcp是通用的TCP接受器池,在Erlang中具有低延迟

    版本: 2.1 桶是通用的TCP接受器池,在Erlang中具有低延迟。 主要特点: 启动/停止TCP和SSL侦听器可以基于“接受”模型与不同的传输一起使用。 (可以是stcp,uTCP ...) 接受连接时延迟低可以使用任何协议,可以是...

    erlang学习2.pdf

    通过上述分析可以看出,“erlang学习2.pdf”文档详细地介绍了Erlang语言在网络编程方面的应用,包括简单的HelloServer、TableServer的设计与实现,以及TCP Server的不同连接模式。这些内容为初学者提供了很好的实践...

    Erlang开发电信网管项目实践.ppt

    标题中的“Erlang开发电信网管项目实践”指的是使用Erlang编程语言来构建电信网络管理系统的过程和经验。在电信行业中,网管系统对于监控、维护和优化网络至关重要,而选择Erlang作为开发语言主要是因为它在并发处理...

    介绍 Erlang binary 和 bit string 数据类型的经典文章

    例如,在处理 TCP 或 UDP 协议中的数据包时,通常需要频繁地进行字节级别的操作,这时使用 binary 类型可以极大地简化代码并提高效率。 #### Bit Strings 的引入 尽管 binary 类型已经很强大,但在处理位级别数据...

    E语言源码文件传输.zip

    Erlang以其在实时系统和电信领域的出色表现而闻名,它的设计目标是实现简单、高效以及容错性强的软件。在E语言源码文件传输过程中,涉及到的知识点广泛,包括Erlang编程基础、文件操作、网络通信以及版本控制等。 ...

    RabbitMQ包以及依赖包

    安装这三个软件包的过程通常涉及使用`rpm`命令,例如: ```bash sudo rpm -ivh erlang-23.3.4.10-1.el7.x86_64.rpm rabbitmq-server-3.10.0-1.el7.noarch.rpm socat-1.7.3.2-5.el7.lux.x86_64.rpm ``` 安装完成后,...

    客户与服务应用之取回客户IP

    在Erlang中,可以使用gen_tcp模块来创建和管理TCP连接,接收客户端的请求,并通过socket接口获取远程IP地址。例如,`gen_tcp:peername(Socket)`可以返回客户端的IP地址和端口号。 项目的实现可能包含以下关键步骤:...

    centos7 安装rabbitmq 直接解压就可以使用

    在CentOS7上安装...总之,RabbitMQ的安装过程虽然简单,但正确配置和使用涉及到许多细节,包括Erlang环境的准备、服务的启动和管理、安全设置以及集群的搭建。这些都需要根据实际应用场景进行适当的调整和优化。

    枪:用于ErlangOTP的HTTP1.1,HTTP2和Websocket客户端

    它的接口与Erlang OTP风格保持一致,与其他Erlang库的集成也相对简单。 7. **生产就绪**:作为标记为“production-ready”的库,Gun已经过严格的测试和实际部署验证,能够在生产环境中放心使用。 8. **与其他库的...

    Socket编程

    通过使用Erlang语言的gen_tcp库,可以编写程序连接至服务器并获取数据。创建TCP客户端的基本流程包括连接服务器、发送数据请求、接收响应以及关闭连接。通过设置选项[binary, {packet, 0}],Socket以二进制模式打开...

Global site tag (gtag.js) - Google Analytics