zoukankan      html  css  js  c++  java
  • Akka边学边写(2)-- Echo Server

    EchoServer

    上篇文章里,我们用Akka写了一个简单的HelloWorld样例,对Akka(以及Actor模式)有了初步的认识。本文将用Akka写一个EchoServer,看看在Actor的世界里,怎样使用TCP协议

    Github项目

    照例。EchoServer的代码被放在了Github上。EchoServer比HelloWorld略微复杂一点,一共同拥有三个类。例如以下图所看到的:

    Main

    这次先从主类入手:

    main()方法的第一行创建了一个Actor系统,名字为mySystem。接下来的四行代码。请看以下的详解。

    TCP Manager

    Akka将整个TCP层抽象为一个Actor,这个Actor就是TCP Manager。在main()方法的第二行代码里,我们给Actor系统加入了一个TCP Manager,并和它的经纪人取得了联系:

    ActorRef tcpManager = Tcp.get(mySystem).getManager();
    如今我们的Actor系统看起来是这样:

    Props

    Props应该是Properties的缩写,它的作用是告诉Actor系统怎样创建一个Actor。Props提供了四个工厂方法来创建Props实例,例如以下所看到的:

    public static Props create(Class<?

    > type, Object[] os) public static <T extends Actor> Props create(Class<T> type, Creator<T> crtr) public static <T extends Actor> Props create(Creator<T> crtr) public static Props create(Class<?

    > type, Seq<Object> seq)

    main()方法的第三行使用了上面的第一个工厂方法。这个工厂方法有两个參数:一个Class。和一个数组(实际上是vararg)。

    第一个參数表示Actor的class,第二个參数是传递给Actor构造函数的參数。这样,Actor系统就知道怎样依据Props创建(用反射调用构造函数)一个Actor实例。main()方法的第四行创建了一个Accepter,起名为accepter。Accepter须要用到tcpManager,这也是我们将tcpManager当做第二个參数传递给Props.create()方法的缘故。如今Actor系统变成了以下这样(我用虚线箭头来表示Actor之间的依赖关系):


    main()方法的第五行给accepter发了一个消息:整数12345。告诉它绑定port12345,開始监听TCP连接,准备echo服务。

    Accepter

    Accepter负责监听port,然后把收到的tcp连接交给Handler去处理。Accepter略微有点复杂,以下是所有代码:

    构造函数是为了建立对tcpManager的依赖,以下具体介绍onReceive()方法:

    • 假设收到的消息是Integer类型(port)。我们给tcpManager发送绑定消息,通知它绑定某个port。
    • 假设tcpManager成功绑定port。它会回应已绑定消息(Bound)。
    • 否则,回应绑定失败消息(CommandFailed)。accepter通过调用getContext().stop()方法结束自己。

    • 成功绑定port后。假设有连接到达,则会收到Connected消息。

      accepter通过调用getContext().actorOf()创建一个Handler,然后把它注冊给tcpManager。

      之后tcpManager就会把与这个连接相关的消息发给handler,换句话说,这个连接被handler接管。

    Actor之间的父子关系

    在Actor系统内部。Actor们之间并非仅仅有简单的依赖(或引用)关系,而是能够形成父子关系:Actor能够创建子Actor。然后把子任务分配给它们去处理。

    一个Actor的Children是通过它的context来管理的,上面代码中。accepter通过getContext()来获得它自己的context,然后通过调用context的actorOf()方法创建子Actor。如果如今有两个client连接到了我们的echoserver,那么整个Actor系统将是以下这样(Actor系统内的实线箭头表示父子关系):

    Handler

    最后一个类是Handler,它比較简单,代码例如以下所看到的:


    Handler仅仅处理两种消息:

    • Received消息告诉handler有消息到达,由于是echoserver。所以并不关心到达的消息里面是什么内容。getSender()方法能够得到消息的发送者。也就是tcpManager。然后给tcpManager发一条Write消息。告诉它把数据原封不动的写回给client。
    • ConnectionClosed告诉handler连接已经断开,handler通过调用context的stop()方法结束自己短暂的生命。

    測试EchoServer

    启动EchoServer。然后能够通过telnet命令进行測试,这里就不具体说明了。

    结论

    要想用Akka写一个echoserver。还是挺难的,须要了解Akka的非常多方面。可是相对于Socket,或者NIO来说,Akka版的echoserver显然更简单。



  • 相关阅读:
    HTML 5 标准属性
    启程
    【Java】自定义登陆拦截器
    【Java】将List中的实体按照某个字段进行分组的算法
    SpringBoot + MultipartFile 实现文件上传以及文件转移的功能以及配置全局捕获上传文件过大异常
    MySQL查询两门及两门以上不及格的学生,显示姓名
    java中可以用==来比较两个字符串是否相等吗
    自己动手Jquery插件
    10个可以直接拿来用的JQuery代码片段
    linux 安装python
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5223512.html
Copyright © 2011-2022 走看看