package cn.yangg.scala.base.init
import java.io.Closeable
import java.nio.channels.ServerSocketChannel
import java.net.InetSocketAddress
import java.nio.channels.SocketChannel
import java.nio.charset.Charset
import java.nio.ByteBuffer
import akka.actor.Actor
import java.nio.channels.Selector
import java.nio.channels.SelectionKey
import akka.actor.ActorSystem
import akka.actor.Props
case class StartService(port: Int)
class ServerActor extends Actor {
val serverChannel = ServerSocketChannel.open()
valserverSocket =serverChannel.socket()
val selector = Selector.open()
val buffer = ByteBuffer.allocate(1024)
val charset = Charset.forName("UTF-8")
val charDecoder =charset.newDecoder()
def receive = {
case StartService(port) =>
this.serverListenerStart(port)
}
def serverListenerStart(port: Int) = {
serverSocket.bind(new InetSocketAddress(port))
serverChannel.configureBlocking(false)
serverChannel.register(selector, SelectionKey.OP_ACCEPT)
var n =0
while (true) {
n = selector.select()
if (n >0) {
val it =selector.selectedKeys().iterator()
while (it.hasNext()) {
val key =it.next()
it.remove() ////删除已选key,防止重复处理
if (key.isAcceptable()) {
val server =key.channel().asInstanceOf[ServerSocketChannel]
val channel =server.accept()
println(channel)
if (null !=channel) {
channel.configureBlocking(false)
channel.register(selector, SelectionKey.OP_READ)
}
} else if (key.isReadable()) {
val socket =key.channel().asInstanceOf[SocketChannel]
var size: Int =0
println("read data ....." + key)
buffer.clear()
size = socket.read(buffer)
while (size >0) {
buffer.flip()
charDecoder.decode(buffer.asReadOnlyBuffer())
.toString().split("\\.\\.\\.\\.").foreach(println)
buffer.clear()
size = socket.read(buffer)
}
if (size == -1) { //当对端主动关闭后移除key,要不然selector会一直返回可读
socket.close()
selector.selectedKeys().remove(key)
}
}
}
}
}
}
}
class ClientActor extends Actor {
val client = SocketChannel.open()
val buffer = ByteBuffer.allocate(1024)
def receive = {
case StartService(port) =>
clientStart(port)
}
def clientStart(port: Int) {
client.connect(new InetSocketAddress(port))
while (true) {
for (i <-1 to5) {
buffer.clear()
buffer.put(("hello server" +i +"....").getBytes("utf8"))
buffer.flip()
client.write(buffer)
}
Thread.sleep(1000)
println(System.currentTimeMillis() + "message to parent....")
}
}
}
object SocketStart {
def main(args: Array[String]) {
this.akkaSocketTest("socketActor",11111)
}
def akkaSocketTest(actorName: String, port: Int) = {
val actorSystem = ActorSystem(actorName)
val serverActor =actorSystem.actorOf(Props[ServerActor],"serverActor")
val clientActor =actorSystem.actorOf(Props[ClientActor],"clientActor")
val startCMD =new StartService(port)
serverActor !startCMD
clientActor !startCMD
}
}
http://blog.csdn.net/yangguo_2011/article/details/28446807
相关推荐
Akka正是用Scala编写的,并且充分展示了Scala在并发编程方面的优势。 #### 2. Akka的核心概念:Actor模型 - **Actor模型**:在Akka中,Actor是最基本的并发单元。每个Actor都独立运行并且通过消息传递与其他Actor...
Scala是一种多范式的编程语言,它结合了面向对象和函数式编程的特点,非常适合构建复杂的并发系统。Akka框架就是用Scala编写的,因此,使用Scala来编写Akka应用程序可以充分利用语言的强大特性和表达能力,如类型...
标题中的“用Scala写的akka actor简单demo”指的是一个使用Scala编程语言编写的Akka Actor系统的基本示例。Akka是轻量级、基于actor模型的框架,它用于构建高度并发、分布式和容错的应用程序。Scala是多范式编程语言...
它基于actor模型,使得在Java虚拟机(JVM)上编写这类程序变得简单高效。Akka的使用通常涉及以下几个核心概念: 1. **Actor系统**:Akka的基础是Actor系统,这是一个全局的管理结构,负责创建、监控和调度Actor。它...
Scala是一种函数式和面向对象编程语言,它与Java无缝集成,是开发Akka应用的首选语言。尽管描述中提到不支持Scala,但Akka的典型实现是使用Scala编写的,因此我们将以Scala为背景来探讨这个项目。 **Akka Actor系统...
3. Scala的学习资料:本书《Scala程序设计:Java虚拟机多核编程实战》是由Venkat Subramaniam所著,郑有李剑翻译,是一本为Java程序员所写,讲授Scala编程的书籍。书中包含了对Scala的函数式编程基础的介绍,涵盖了...
基于Scala Akka的分布式主题网络爬虫资料齐全+文档详细.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请...
Akka之所以使用Scala语言编写,是因为Scala的强大特性和其与JVM的无缝集成,使得Akka能够充分利用JVM的优势并发挥出Scala的函数式编程和面向对象编程的双重优势。同时,Akka也提供了对Java的全面支持,开发者可以...
Akka是一个用Scala和Java编写的库,用于构建并发、分布式以及容错的事件驱动应用。Akka框架借鉴了Erlang的并发模型,但它是建立在JVM之上,并且提供了丰富的抽象和工具,能够简化开发工作。 标题“Akka Scala 学习...
本书循序渐进地介绍了Scala的函数式编程基础,虽然篇幅短小,却切中要害。读者可以学会使用Scala静态语言的强大功能创建简洁、可扩展、高度可并行的代码。对于多核时代JVM上的并发编程,Scala是绝好的工具,而本书是...
Reactive Programming with Scala and Akka 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Akka是实现响应式架构的一个强大工具,尤其在Scala编程语言中广泛使用。 Akka是一个由Lightbend公司开发的开源框架,它基于Actor模型,为构建高度并发、分布式和容错的系统提供了基础。Actor模型是一种并发计算的...
《Scala程序设计:Java虚拟机多核编程实战》是一本专为程序员和有经验的Java开发者设计的书籍,旨在引导读者掌握Scala语言,利用其功能强大的特性进行并发编程。Scala是一种融合了函数式和面向对象编程特点的静态...
Harness reactive programming to build scalable and fault-tolerant distributed systems using Scala and Akka About This Book Use the concepts of reactive programming to build distributed systems ...
《Reactive Programming with Scala and Akka》是一本关于使用Scala语言和Akka框架开发响应式程序的专业书籍。该书系统地介绍了响应式编程的概念、原理和实践,尤其强调了响应式编程在构建可伸缩、高效能、高可靠性...
标题提及了两本书籍资源——"Scala程序设计(第2版).pdf"和"Scala程序设计-JAVA虚拟机多核编程实战.pdf",这表明主题聚焦在Scala编程语言以及其与Java虚拟机(JVM)多核编程的结合应用上。描述简单明了,确认了这两...
它是由Martin Odersky在2003年设计并实现的,融合了Java虚拟机(JVM)的优势,并引入了函数式编程的概念,使得它成为大数据处理和并发系统开发的首选语言之一。 本书“Scala编程”PDF版,为学习者提供了深入理解...
这本书适合有编程基础,对函数式编程感兴趣的读者,无论你是Java开发者还是对新编程范式好奇的学习者,都可以从中了解到如何在Scala和Clojure中应用函数式编程来提高代码质量和效率。 【结论】 随着大数据时代的...