`

Erlang--TCP学习(二)简单web_Server篇

阅读更多
  现在来写个简单的web服务器,要实现的功能是:只接受一个socket连接请求。

服务器代码: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().


服务端结果:


客户端结果:
  • 大小: 10.8 KB
  • 大小: 9.9 KB
分享到:
评论

相关推荐

    RabbitMQ包以及依赖包

    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...

    RabbitMQ技术帮助文档

    #### 二、AMQP 协议介绍 AMQP(Advanced Message Queuing Protocol)是一种开放标准的应用层协议,用于消息中介服务。它定义了消息如何在网络中传输以及如何被存储和检索。AMQP 的主要特性包括: - **高级功能**:...

    erlang和rabbitmq.zip

    5. **内置TCP/IP支持**:Erlang提供了丰富的网络库,使得创建网络服务变得简单。 【RabbitMQ】 RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)协议的消息中间件,用于解耦和异步处理。RabbitMQ的主要...

    RabbitMq 集群搭建linux

    #### 二、RabbitMQ相关端口及防火墙配置 RabbitMQ集群运行时需要确保以下端口开放,以便进行正常的通信和服务访问: - **4369 (EPMD)**:用于节点间发现和通信。 - **5672, 5671 (AMQP 0-9-1 and 1.0 without and ...

    rabbitmq安装.docx

    #### 二、安装前准备 1. **确认Erlang环境**:RabbitMQ基于Erlang语言开发,因此在安装RabbitMQ之前需要先安装Erlang。 2. **网络环境**:确保服务器能够连接到外部网络,以便下载必要的安装包。 #### 三、安装步骤...

    RabbitMQ Linux 安装

    #### 二、准备工作 在安装 RabbitMQ 之前,我们需要先确保已经安装了必要的依赖项——Erlang。 ##### 2.1 安装 Erlang Erlang 是 RabbitMQ 的底层开发语言,因此在安装 RabbitMQ 之前需要先安装 Erlang。 - **...

    Erlang中的socket编程简单例子

    本文将深入探讨Erlang中的TCP和UDP socket编程,以及如何实现简单的echo服务器和客户端。 首先,我们需要了解Erlang中处理TCP socket的gen_tcp模块。gen_tcp模块提供了用于创建TCP连接的接口,它允许我们监听端口、...

    Centos安装Rabbitmq.docx

    #### 二、安装准备 1. **创建安装目录**: ```bash mkdir -p /usr/local/mq/rabbitmq ``` 这一步骤用于创建存放 RabbitMQ 及其依赖 Erlang 的安装包目录。 2. **安装必要的软件库**: ```bash yum install -...

    Erlang实现的一个Web服务器代码实例

    在上述代码中,我们看到的是一个简单的Erlang Web服务器实现,名为`httpd.erl`。这个服务器可以接收HTTP请求,并根据请求返回静态文件。 1. **模块定义与导出**: 模块名为`httpd`,作者为`ninhenry@gmail.com`。...

    CentOS7安装RabbitMQ所需安装包

    在Linux系统,特别是CentOS 7环境中安装RabbitMQ,这是一个关键的任务,因为RabbitMQ是一个广泛使用的开源消息代理和队列服务器,基于Erlang编程语言开发。它支持多种消息协议,使得分布式系统中的异步任务处理和...

    rabbitmq安装

    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`登录,需要...

    rabbitmq3.7.8安装-cent7.3-详细文档笔记-带安装包

    接下来,启用管理插件,这样可以通过Web界面管理RabbitMQ: ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` 重启RabbitMQ服务以应用更改: ```bash sudo systemctl restart rabbitmq-server ``` ...

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

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

    linux 安装rabbitmq

    #### 二、安装准备 在开始安装之前,我们需要确保系统中已经安装了必要的软件包,包括但不限于make、gcc、gcc-c++等工具,这些工具对于编译Erlang及RabbitMQ来说是必不可少的。此外,还需要安装一些依赖库,如...

    Centos7安装rabbitmq

    在 CentOS 7 系统上安装 RabbitMQ 需要遵循一系列步骤,因为默认的 YUM 软件仓库中的 RabbitMQ 和 Erlang 版本可能较低。首先,我们需要安装最新版的 Erlang,因为 RabbitMQ 需要特定版本以上的 Erlang。这可以通过...

    mochiweb实例

    这个实例将帮助我们理解Mochiweb是如何工作的,并如何使用它来构建一个简单的Web服务器。Erlang是一种并发性极强、容错性高的语言,特别适合构建分布式系统,而Mochiweb则是Erlang生态系统中的一个重要组件。 首先...

    安装Rabbitmq 所需的rpm包

    RabbitMQ是用Erlang编程语言编写的,因此需要先安装Erlang环境。运行以下命令: ```bash sudo yum install erlang -y ``` 4. **下载RabbitMQ RPM包** 可以从RabbitMQ的官方网站下载最新的RPM包,或者直接通过...

    rabbitMq安装包

    7. **安装步骤**:在Linux环境下,可以通过`rpm`命令安装这些包,例如`sudo rpm -ivh erlang-*.rpm socat-*.rpm rabbitmq-server-*.rpm`。安装后,还需要启动RabbitMQ服务并配置相关参数。 8. **管理工具**:...

    一个用Erlang公告板系统在一个局域网内构造 BBS 集群,

    2. **发布与订阅模式**:Erlang中的`gen_server`行为和`gen_event`行为可以用来实现发布/订阅模式,这对于公告板系统至关重要。用户发帖或回帖的消息可以通过这样的模式广播到集群内的所有节点,确保数据同步。 3. ...

    RabbitMQ在CentOS上安装

    #### 二、Java对接RabbitMQ 安装完RabbitMQ后,通常需要将其与应用程序集成。以Java为例,介绍如何使用RabbitMQ Java客户端库实现消息发送与接收功能。具体步骤包括: 1. **添加依赖**:在项目中引入RabbitMQ的...

Global site tag (gtag.js) - Google Analytics