上次提到了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服务器是用Erlang编程语言实现的一种网络通信服务,它允许程序通过TCP协议接收和发送数据。在Erlang中,构建TCP服务器通常涉及到以下关键知识点: 1. **Erlang OTP(Open Telecom Platform)**:Erlang ...
gen_tcp是Erlang OTP(开放电信平台)提供的一种行为模块,它允许程序员以面向过程的方式处理TCP连接。gen_tcp提供了创建、监听、接受和关闭TCP套接字的函数,以及发送和接收数据的基本操作。 **Erlang的并发特性**...
2. **Erlang实现Websocket**:在Erlang中,可以使用如`cowboy`或`mochiweb`这样的Web框架来处理Websocket连接。它们提供了方便的中间件,使得在Erlang进程中直接处理Websocket连接成为可能。例如,`cowboy`中的`...
- **调试**: 使用调试工具逐步跟踪函数调用过程。 #### 25. Erlang测试案例编写 - **Common Test**: Erlang官方提供的测试框架。 - **Test Server**: 一种简单的测试服务器,用于模拟真实的服务环境。 - **应用...
在本文中,我们将探讨如何使用Erlang的OTP(Open Telecom Platform)原则构建一个非阻塞的TCP服务器。OTP为开发健壮、容错的应用提供了强大的框架,它包含了一系列行为模式,如gen_server和gen_fsm,这些模式可以...
本文介绍了Erlang的基本安装流程、编写简单的Hello World程序以及实现一个TCP客户端的过程。此外,还涵盖了Erlang中的一些核心概念,如进程、消息传递、模式匹配和递归等。对于初学者来说,这些都是非常重要的知识点...
- **远程过程调用(RPC)**: Erlang提供了简单的RPC机制,允许开发者在不同节点之间执行函数调用,从而简化了分布式系统的开发。 ##### 分布式TableServer 在Erlang中,TableServer是一种用于管理键值对的数据结构,...
`{socket, gen_tcp}`表示我们使用gen_tcp作为底层协议,`{active, once}`则意味着Erlang进程将只接收一次来自socket的数据,之后需要手动调用`esockd:recv/2`或`esockd:recv/3`来接收更多数据。 对于服务器端,我们...
版本: 2.1 桶是通用的TCP接受器池,在Erlang中具有低延迟。 主要特点: 启动/停止TCP和SSL侦听器可以基于“接受”模型与不同的传输一起使用。 (可以是stcp,uTCP ...) 接受连接时延迟低可以使用任何协议,可以是...
通过上述分析可以看出,“erlang学习2.pdf”文档详细地介绍了Erlang语言在网络编程方面的应用,包括简单的HelloServer、TableServer的设计与实现,以及TCP Server的不同连接模式。这些内容为初学者提供了很好的实践...
标题中的“Erlang开发电信网管项目实践”指的是使用Erlang编程语言来构建电信网络管理系统的过程和经验。在电信行业中,网管系统对于监控、维护和优化网络至关重要,而选择Erlang作为开发语言主要是因为它在并发处理...
例如,在处理 TCP 或 UDP 协议中的数据包时,通常需要频繁地进行字节级别的操作,这时使用 binary 类型可以极大地简化代码并提高效率。 #### Bit Strings 的引入 尽管 binary 类型已经很强大,但在处理位级别数据...
Erlang以其在实时系统和电信领域的出色表现而闻名,它的设计目标是实现简单、高效以及容错性强的软件。在E语言源码文件传输过程中,涉及到的知识点广泛,包括Erlang编程基础、文件操作、网络通信以及版本控制等。 ...
安装这三个软件包的过程通常涉及使用`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 ``` 安装完成后,...
在Erlang中,可以使用gen_tcp模块来创建和管理TCP连接,接收客户端的请求,并通过socket接口获取远程IP地址。例如,`gen_tcp:peername(Socket)`可以返回客户端的IP地址和端口号。 项目的实现可能包含以下关键步骤:...
在CentOS7上安装...总之,RabbitMQ的安装过程虽然简单,但正确配置和使用涉及到许多细节,包括Erlang环境的准备、服务的启动和管理、安全设置以及集群的搭建。这些都需要根据实际应用场景进行适当的调整和优化。
它的接口与Erlang OTP风格保持一致,与其他Erlang库的集成也相对简单。 7. **生产就绪**:作为标记为“production-ready”的库,Gun已经过严格的测试和实际部署验证,能够在生产环境中放心使用。 8. **与其他库的...
通过使用Erlang语言的gen_tcp库,可以编写程序连接至服务器并获取数据。创建TCP客户端的基本流程包括连接服务器、发送数据请求、接收响应以及关闭连接。通过设置选项[binary, {packet, 0}],Socket以二进制模式打开...