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。告诉它绑定端口12345,开始监听TCP连接,准备echo服务。

Accepter

Accepter负责监听端口,然后把收到的tcp连接交给Handler去处理。Accepter稍微有点复杂,下面是全部代码:

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

  • 如果收到的消息是Integer类型(port),我们给tcpManager发送绑定消息,通知它绑定某个端口。
  • 如果tcpManager成功绑定端口,它会回应已绑定消息(Bound)。
  • 否则,回应绑定失败消息(CommandFailed),accepter通过调用getContext().stop()方法结束自己。
  • 成功绑定端口后,如果有连接到达,则会收到Connected消息。accepter通过调用getContext().actorOf()创建一个Handler,然后把它注册给tcpManager。之后tcpManager就会把与这个连接相关的消息发给handler,换句话说,这个连接被handler接管。

Actor之间的父子关系

在Actor系统内部,Actor们之间并不是只有简单的依赖(或引用)关系,而是可以形成父子关系:Actor可以创建子Actor,然后把子任务分配给它们去处理。一个Actor的Children是通过它的context来管理的,上面代码中,accepter通过getContext()来获得它自己的context,然后通过调用context的actorOf()方法创建子Actor。假设现在有两个客户端连接到了我们的echo服务器,那么整个Actor系统将是下面这样(Actor系统内的实线箭头表示父子关系):

Handler

最后一个类是Handler,它比较简单,代码如下所示:

Handler只处理两种消息:

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

测试EchoServer

启动EchoServer,然后可以通过telnet命令进行测试,这里就不详细说明了。

结论

要想用Akka写一个echo服务器,还是挺难的,需要了解Akka的很多方面。但是相对于Socket,或者NIO来说,Akka版的echo服务器显然更简单。

时间: 2024-11-06 22:46:31

Akka学习笔记(2)-- Echo Server的相关文章

(转)Akka学习笔记

Akka学习笔记系列文章: <Akka学习笔记:ACTORS介绍> <Akka学习笔记:Actor消息传递(1)> <Akka学习笔记:Actor消息传递(2)> <Akka学习笔记:日志> <Akka学习笔记:测试Actors> <Akka学习笔记:Actor消息处理-请求和响应(1) > <Akka学习笔记:Actor消息处理-请求和响应(2) > <Akka学习笔记:ActorSystem(配置)> &l

Python学习笔记20:server先进

我们不依赖于一个框架,CGI如果是,只能使用socket介面.他完成了一个可以处理HTTP要求Pythonserver. 基于,不管是什么的计算机的操作系统(推荐Linux)和Python该计算机可被用作HTTPserver采用.要设置你的网站. 改写上一篇文章中的程序.并引入更高级的Python包,以写出更成熟的Pythonserver. 一 支持POST 我们首先改写原文中的HTTPserver,从而让该server支持更加丰富的HTTP请求. 相对于原程序,这里增添了表格以及相应"POST

Akka学习笔记(3)-- ByteString

Akka的IO层设计可以参考这篇文档,本文简单介绍一下ByteString的设计. Immutable消息 Actor之间是通过消息沟通的,但为了避免同步问题,消息必须是Immutable.因此,Akka无法使用byte[]或ByteBuffer,而是设计了ByteString来表示二进制数据.理解这一点很重要,因为ByteString是不可变的,所以ByteString的很多看似修改状态的方法实际上都是返回一个新的ByteString实例.如果对String或BigInteger等Java自带

Java NIO学习笔记七 Non-blocking Server

Java NIO:Non-blocking Server 即使你了解了Java NIO非阻塞功能的工作(怎么样Selector,Channel, Buffer等等),设计一个无阻塞服务器仍然很难.非阻塞IO包含了相比阻塞IO的要有难度.本章非阻塞服务器教程将讨论非阻塞服务器的主要挑战,并为他们描述一些潜在的解决方案. 本教程中描述的想法是围绕Java NIO设计的.但是,我认为,只要有这样的构造,这些想法可以用其他语言重复使用Selector.据我所知,这样的结构是由底层操作系统提供的,所以很有

学习笔记:windows server 2008 R2服务器搭建SQL Server 2008 R2环境

一.安装前准备 1.下载SQL Server 版本,在传送门左侧菜单服务器模块下选择相应的版本,因为服务器的操作系统版本是windows server 2008 R2,我选择的SQL Server 2008 R2版本. 2.为了使安装的进度加快,防止中途因残留而安装失败,我们先确定操作系统里面是否有SQL server的残余,先在控制面板的程序下面卸载SQL Server,之后为了卸载完全,利用Windows Clear Up将残留一并清除. 3.下载完SQL server 2008 R2后得到

Akka学习笔记(1)-- Hello, World!

Akka Akka是什么呢?直接引用Akka网站上面的描述吧: Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on the JVM. 反正我觉得Akka是比较难上手的,而且文档对于新手来说,也不太友好.本文会用Akka写一个Hello World程序,从这个程序入手,介绍Akka的一些基本概念. hell

学习笔记:windows server 2008 R2服务器安装IIS并添加网站

这次依旧是连接远程服务器进行操作,顺带记录一下链接远程的操作 一.连接远程计算机 1.因为我的电脑是win7系统,故这里以win7为例,其他windows系统大同小异,首先点开开始菜单栏,在windows附件下找到远程桌面连接 或者采用通用的方法,利用快捷键win+R,之后在运行框中输入mstsc就可以调出远程桌面连接 2.在常规菜单栏下输入计算机名和用户名,在远程时,如果需要在远程计算机和本地计算机进行一些文件操作,如复制.剪切,可以继续点击本地资源 3.点击详细信息下,选择需要进行共享的本地

0806------Linux网络编程----------Echo 网络库 学习笔记

1.Echo网络库的编写 1.1 Echo网络库1.0 1.1.1 Echo网络库 1.0 框架分析 a)class InetAddress: 主要用来定义一个struct sockaddr_in 结构(用自定义端口号初始化),并提供获取这个结构体成员如IP.Port等的接口: b)class Socket : 主要用来把一个普通的 sockfd 变为 listenfd(这里用一个sockfd初始化对象),提供bind .listen.accept 等接口. c)class TcpConnect

Linux学习笔记——如何使用echo指令向文件写入内容

0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容的基本方法是使用IO重定向指令--">",默认情况下echo输出到标准输出中,使用>指令可重定向输出到文件中. 1.echo指令基本用法 [1]Linux官方用户手册--echo指令 [2]输入指令获得帮助 sudo echo --help 返回内容如下 用法:echo [短选项]... [字