- 浏览: 51935 次
- 性别:
- 来自: 广州
最新评论
现在来写个简单的web服务器,要实现的功能是:只接受一个socket连接请求。
服务器代码:tcp_server.erl
客户端代码:tcp_client.erl
执行服务端代码:
执行客户端代码:
服务端结果:
客户端结果:
服务器代码:tcp_server.erl
-module(tcp_server). -compile(export_all). -define(TCP_OPT, [binary, {packet, 4}, {reuseaddr,true}, {active, true}]). %% binary 设置通信数据格式,可以通过简单的term_to_binary编码, binary_to_term解码 %% {packet, 4} 每个报文从一个4字节长的头开始 %% {reuseaddr, true} 端口复用 %% {active, true} 主动套接字(非阻塞) %% {active,false} 被动套接字(阻塞) %% {active,once} 主动套接字仅接受一条信息,要想接受下一条必须再次激活(半阻塞) start_server() -> {ok, ListenSocket} = gen_tcp:listen(8888, ?TCP_OPT), %% 监听8888端口 io:format(" listen socket :~p~n", [ListenSocket]), {ok, Socket} = gen_tcp:accept(ListenSocket), %% 程序挂起,等待连接 io:format(" accept socket :~p~n", [Socket]), gen_tcp:close(ListenSocket),%% 关闭监听,服务器无法再建立新的连接 %% 不影响已有的socket通信 loop(Socket). loop(Socket) -> receive {tcp, Socket, Bin} -> io:format("receive bin data: ~p~n",[Bin]), Str = binary_to_term(Bin), io:format("unpack data: ~w~n",[Str]), Reply = {9999,9999000}, io:format("server reply: ~p~n", [Reply]), gen_tcp:send(Socket, term_to_binary(Reply)), loop(Socket); {tcp_closed, Socket} -> io:format("socket closed: ~p~n",[Socket]) after 3000 -> %% 超时关闭socket gen_tcp:close(Socket) end.
客户端代码:tcp_client.erl
-module(tcp_client). -export([test_tcp/0]). test_tcp() -> {ok, Socket} = gen_tcp:connect("localhost", 8888, [binary, {packet, 4}]), io:format("listen socket:~p~n",[Socket]), SendData = term_to_binary({10,12}), Data2 = term_to_binary({56,12}), %% 发送了两次数据,是为了验证: %% 服务端关闭了listensocket,并不影响已有的socket ok = gen_tcp:send(Socket, SendData), ok = gen_tcp:send(Socket, Data2), loop(Socket). loop(Socket) -> receive {tcp, Socket, Bin} -> io:format("receive bin data: ~p~n",[Bin]), Val = binary_to_term(Bin), io:format("receive data: ~p~n",[Val]), loop(Socket); {tcp_closed, Socket} -> io:format("socket closed :~p~n",[Socket]) end.
执行服务端代码:
erlc tcp_server.erl erl tcp_server:start_server().
执行客户端代码:
erlc tcp_client.erl erl tcp_client:test_tcp().
服务端结果:
客户端结果:
发表评论
-
erlang-Astart算法
2018-07-02 08:34 489%%%-------------------------- ... -
erlang--常用内建函数收录
2016-07-15 15:43 5391:gen_event:which_handlers(Even ... -
erlang异常--try...catch
2016-07-13 19:48 948触发异常 throw(Term) exit(Reason ... -
erlang-退出信号捕捉trap_exit
2016-07-12 09:54 1041进程链接的工作: A进程意外退出时,会产生一个退出信号。所 ... -
Erlang--随机数
2016-04-25 10:26 19791、普通随机 random:uniform(N) 2、以时间 ... -
Erlang--性能分析工具之eprof
2016-04-12 18:22 689eprof是erlang自带的一个性能分析工具,可以帮助我 ... -
Erlang监控工具(二)etop
2016-04-07 17:46 1788file:///D:/Program%20Files/er ... -
Erlang监控工具(一)observer
2016-04-05 15:17 1279Erlang系统本身携带一个图形化监控工具,它可以监控:系 ... -
Erlang--epmd
2016-03-30 14:13 614epmd Erlang Port Mapper Daemo ... -
Erlang--节点
2016-03-30 11:25 735Erlang节点 file:///D:/Program%20F ... -
小技巧收录----唯一ID
2016-03-08 14:34 923在游戏开发中,角色id或者公会id等都需要做唯一设计, ... -
Erlang--TCP学习(五)总结篇
2015-07-15 19:55 1756一、erlang socket的消息流的三种控制方式: 1 ... -
Erlang--TCP学习(四)并行web server篇
2015-07-14 20:09 684-module(tcp_parallel_server). ... -
Erlang--TCP学习(三)串行web server篇
2015-07-14 19:35 511简单web sever改进版:串行服务器,一次只接受一个连 ... -
Erlang--TCP学习(一)Client篇
2015-07-14 16:39 739gen_tcp:connect(Host,Port,[Op ... -
erlang sasl错误日志
2015-04-22 16:03 1423SASL (System Architecture Sup ... -
erl启动参数
2015-04-20 16:54 1057erl启动参数分类 1 emulator flags 用“ ... -
Erlang和SMP
2015-04-17 15:44 1712SMP:Symmetrical Multi Processor ... -
写个makefile编译erlang_protobuffs
2015-03-16 20:23 1600erlang_protobuffs源码下载地址: https: ... -
erlang安装
2015-03-09 17:38 702erlang安装 1 解压包 tar -zxvf otp_s ...
相关推荐
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 ``` 安装完成后,需要启动RabbitMQ服务,并确保其在开机时自动启动: ```bash sudo...
#### 二、AMQP 协议介绍 AMQP(Advanced Message Queuing Protocol)是一种开放标准的应用层协议,用于消息中介服务。它定义了消息如何在网络中传输以及如何被存储和检索。AMQP 的主要特性包括: - **高级功能**:...
5. **内置TCP/IP支持**:Erlang提供了丰富的网络库,使得创建网络服务变得简单。 【RabbitMQ】 RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)协议的消息中间件,用于解耦和异步处理。RabbitMQ的主要...
#### 二、RabbitMQ相关端口及防火墙配置 RabbitMQ集群运行时需要确保以下端口开放,以便进行正常的通信和服务访问: - **4369 (EPMD)**:用于节点间发现和通信。 - **5672, 5671 (AMQP 0-9-1 and 1.0 without and ...
#### 二、安装前准备 1. **确认Erlang环境**:RabbitMQ基于Erlang语言开发,因此在安装RabbitMQ之前需要先安装Erlang。 2. **网络环境**:确保服务器能够连接到外部网络,以便下载必要的安装包。 #### 三、安装步骤...
#### 二、准备工作 在安装 RabbitMQ 之前,我们需要先确保已经安装了必要的依赖项——Erlang。 ##### 2.1 安装 Erlang Erlang 是 RabbitMQ 的底层开发语言,因此在安装 RabbitMQ 之前需要先安装 Erlang。 - **...
本文将深入探讨Erlang中的TCP和UDP socket编程,以及如何实现简单的echo服务器和客户端。 首先,我们需要了解Erlang中处理TCP socket的gen_tcp模块。gen_tcp模块提供了用于创建TCP连接的接口,它允许我们监听端口、...
#### 二、安装准备 1. **创建安装目录**: ```bash mkdir -p /usr/local/mq/rabbitmq ``` 这一步骤用于创建存放 RabbitMQ 及其依赖 Erlang 的安装包目录。 2. **安装必要的软件库**: ```bash yum install -...
在上述代码中,我们看到的是一个简单的Erlang Web服务器实现,名为`httpd.erl`。这个服务器可以接收HTTP请求,并根据请求返回静态文件。 1. **模块定义与导出**: 模块名为`httpd`,作者为`ninhenry@gmail.com`。...
在Linux系统,特别是CentOS 7环境中安装RabbitMQ,这是一个关键的任务,因为RabbitMQ是一个广泛使用的开源消息代理和队列服务器,基于Erlang编程语言开发。它支持多种消息协议,使得分布式系统中的异步任务处理和...
iptables -I INPUT -p tcp --dport 15672 -j ACCEPT /etc/rc.d/init.d/iptables save ``` 从RabbitMQ 3.3.0开始,默认禁止了非localhost的`guest/guest`权限访问。如果你希望远程机器使用`guest/guest`登录,需要...
接下来,启用管理插件,这样可以通过Web界面管理RabbitMQ: ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` 重启RabbitMQ服务以应用更改: ```bash sudo systemctl restart rabbitmq-server ``` ...
在CentOS7上安装...总之,RabbitMQ的安装过程虽然简单,但正确配置和使用涉及到许多细节,包括Erlang环境的准备、服务的启动和管理、安全设置以及集群的搭建。这些都需要根据实际应用场景进行适当的调整和优化。
#### 二、安装准备 在开始安装之前,我们需要确保系统中已经安装了必要的软件包,包括但不限于make、gcc、gcc-c++等工具,这些工具对于编译Erlang及RabbitMQ来说是必不可少的。此外,还需要安装一些依赖库,如...
在 CentOS 7 系统上安装 RabbitMQ 需要遵循一系列步骤,因为默认的 YUM 软件仓库中的 RabbitMQ 和 Erlang 版本可能较低。首先,我们需要安装最新版的 Erlang,因为 RabbitMQ 需要特定版本以上的 Erlang。这可以通过...
这个实例将帮助我们理解Mochiweb是如何工作的,并如何使用它来构建一个简单的Web服务器。Erlang是一种并发性极强、容错性高的语言,特别适合构建分布式系统,而Mochiweb则是Erlang生态系统中的一个重要组件。 首先...
RabbitMQ是用Erlang编程语言编写的,因此需要先安装Erlang环境。运行以下命令: ```bash sudo yum install erlang -y ``` 4. **下载RabbitMQ RPM包** 可以从RabbitMQ的官方网站下载最新的RPM包,或者直接通过...
7. **安装步骤**:在Linux环境下,可以通过`rpm`命令安装这些包,例如`sudo rpm -ivh erlang-*.rpm socat-*.rpm rabbitmq-server-*.rpm`。安装后,还需要启动RabbitMQ服务并配置相关参数。 8. **管理工具**:...
2. **发布与订阅模式**:Erlang中的`gen_server`行为和`gen_event`行为可以用来实现发布/订阅模式,这对于公告板系统至关重要。用户发帖或回帖的消息可以通过这样的模式广播到集群内的所有节点,确保数据同步。 3. ...
#### 二、Java对接RabbitMQ 安装完RabbitMQ后,通常需要将其与应用程序集成。以Java为例,介绍如何使用RabbitMQ Java客户端库实现消息发送与接收功能。具体步骤包括: 1. **添加依赖**:在项目中引入RabbitMQ的...