`
wbj0110
  • 浏览: 1602219 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

scala akka 修炼之路3(基于java nio的socket编程)

    博客分类:
  • Akka
阅读更多

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

 
 
分享到:
评论

相关推荐

    scala akka

    Akka正是用Scala编写的,并且充分展示了Scala在并发编程方面的优势。 #### 2. Akka的核心概念:Actor模型 - **Actor模型**:在Akka中,Actor是最基本的并发单元。每个Actor都独立运行并且通过消息传递与其他Actor...

    响应式架构 消息模式Actor实现与Scala.Akka应用集成

    Scala是一种多范式的编程语言,它结合了面向对象和函数式编程的特点,非常适合构建复杂的并发系统。Akka框架就是用Scala编写的,因此,使用Scala来编写Akka应用程序可以充分利用语言的强大特性和表达能力,如类型...

    用Scala写的akka actor简单demo

    标题中的“用Scala写的akka actor简单demo”指的是一个使用Scala编程语言编写的Akka Actor系统的基本示例。Akka是轻量级、基于actor模型的框架,它用于构建高度并发、分布式和容错的应用程序。Scala是多范式编程语言...

    Scala Akka项目源码

    它基于actor模型,使得在Java虚拟机(JVM)上编写这类程序变得简单高效。Akka的使用通常涉及以下几个核心概念: 1. **Actor系统**:Akka的基础是Actor系统,这是一个全局的管理结构,负责创建、监控和调度Actor。它...

    基于Akka的加密消息通信.rar_scala akka_基于Akka通信框架的加密通信项目_消息通信

    Scala是一种函数式和面向对象编程语言,它与Java无缝集成,是开发Akka应用的首选语言。尽管描述中提到不支持Scala,但Akka的典型实现是使用Scala编写的,因此我们将以Scala为背景来探讨这个项目。 **Akka Actor系统...

    SCALA程序设计-JAVA虚拟机多核编程实战

    3. Scala的学习资料:本书《Scala程序设计:Java虚拟机多核编程实战》是由Venkat Subramaniam所著,郑有李剑翻译,是一本为Java程序员所写,讲授Scala编程的书籍。书中包含了对Scala的函数式编程基础的介绍,涵盖了...

    akka框架,应用于scala

    Akka之所以使用Scala语言编写,是因为Scala的强大特性和其与JVM的无缝集成,使得Akka能够充分利用JVM的优势并发挥出Scala的函数式编程和面向对象编程的双重优势。同时,Akka也提供了对Java的全面支持,开发者可以...

    Akka Scala 学习高清原版pdf

    Akka是一个用Scala和Java编写的库,用于构建并发、分布式以及容错的事件驱动应用。Akka框架借鉴了Erlang的并发模型,但它是建立在JVM之上,并且提供了丰富的抽象和工具,能够简化开发工作。 标题“Akka Scala 学习...

    Scala程序设计_Java虚拟机多核编程实战

    本书循序渐进地介绍了Scala的函数式编程基础,虽然篇幅短小,却切中要害。读者可以学会使用Scala静态语言的强大功能创建简洁、可扩展、高度可并行的代码。对于多核时代JVM上的并发编程,Scala是绝好的工具,而本书是...

    Reactive Programming with Scala and Akka mobi

    Reactive Programming with Scala and Akka 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    响应式架构++消息模式Actor实现与Scala.Akka应用集成+,沃恩·弗农+

    Akka是实现响应式架构的一个强大工具,尤其在Scala编程语言中广泛使用。 Akka是一个由Lightbend公司开发的开源框架,它基于Actor模型,为构建高度并发、分布式和容错的系统提供了基础。Actor模型是一种并发计算的...

    Scala程序设计:Java虚拟机多核编程实战1

    《Scala程序设计:Java虚拟机多核编程实战》是一本专为程序员和有经验的Java开发者设计的书籍,旨在引导读者掌握Scala语言,利用其功能强大的特性进行并发编程。Scala是一种融合了函数式和面向对象编程特点的静态...

    Reactive.Programming.with.Scala.and.Akka.1783984341.epub

    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(Pdf格式)

    《Reactive Programming with Scala and Akka》是一本关于使用Scala语言和Akka框架开发响应式程序的专业书籍。该书系统地介绍了响应式编程的概念、原理和实践,尤其强调了响应式编程在构建可伸缩、高效能、高可靠性...

    图灵书籍(Scala程序设计(第2版).pdf+Scala程序设计-JAVA虚拟机多核编程实战.pdf)

    标题提及了两本书籍资源——"Scala程序设计(第2版).pdf"和"Scala程序设计-JAVA虚拟机多核编程实战.pdf",这表明主题聚焦在Scala编程语言以及其与Java虚拟机(JVM)多核编程的结合应用上。描述简单明了,确认了这两...

    Scala编程 pdf

    它是由Martin Odersky在2003年设计并实现的,融合了Java虚拟机(JVM)的优势,并引入了函数式编程的概念,使得它成为大数据处理和并发系统开发的首选语言之一。 本书“Scala编程”PDF版,为学习者提供了深入理解...

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    这本书适合有编程基础,对函数式编程感兴趣的读者,无论你是Java开发者还是对新编程范式好奇的学习者,都可以从中了解到如何在Scala和Clojure中应用函数式编程来提高代码质量和效率。 【结论】 随着大数据时代的...

Global site tag (gtag.js) - Google Analytics