Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 每个演员的Akka插座_Multithreading_Sockets_Scala_Akka_Actor - Fatal编程技术网

Multithreading 每个演员的Akka插座

Multithreading 每个演员的Akka插座,multithreading,sockets,scala,akka,actor,Multithreading,Sockets,Scala,Akka,Actor,将Scala与Akka IO结合使用,有没有一种方法可以让一个参与者严格地进行监听,然后在建立连接时创建一个新的参与者来负责该套接字(读、写等) 到目前为止,我有这个。问题是服务器参与者正在接收数据。我想将套接字的所有权转移给新创建的客户机参与者,以便它接收与套接字相关的任何消息。有人知道怎么做吗 编辑:添加解决方案。我只需要将ActorRef传递到当前参数accept中 import akka.actor._ import akka.actor.IO.SocketHandle import j

将Scala与Akka IO结合使用,有没有一种方法可以让一个参与者严格地进行监听,然后在建立连接时创建一个新的参与者来负责该套接字(读、写等)

到目前为止,我有这个。问题是服务器参与者正在接收数据。我想将套接字的所有权转移给新创建的客户机参与者,以便它接收与套接字相关的任何消息。有人知道怎么做吗

编辑:添加解决方案。我只需要将ActorRef传递到当前参数accept中

import akka.actor._
import akka.actor.IO.SocketHandle
import java.net.InetSocketAddress


/**
 * Purpose:
 * User: chuck
 * Date: 17/01/13
 * Time: 5:37 PM
 */
object Main {

  class Server extends Actor {

    override def preStart() {
      IOManager(context.system) listen new InetSocketAddress(3333)
    }

    def receive = {

      case IO.NewClient(server) =>

        val client = context.actorOf(Props(new Client()))
        server.accept()(client)
        println("Client accepted")

      case IO.Read(socket, bytes) =>
        println("Server " + bytes)


    }
  }

  class Client() extends Actor {

    def receive = {

      case IO.Read(socket, bytes) =>
        println("Client " + bytes)

      case IO.Closed(socket, reason) =>
        println("Socket closed " + reason)

    }

  }

  def main(args: Array[String]) {
    val system = ActorSystem()
    system.actorOf(Props(new Server))
  }

}

谢谢

要让答案更清晰一些:

从for
服务器句柄

def accept ()(implicit socketOwner: ActorRef): SocketHandle
socketOwnerActorRef,应接收与SocketChannel关联的事件。将使用当前参与者的ActorRef 含蓄地

如果未向curried参数传递任何内容(仅调用
server.accept()
),则当前参与者(服务器)将从SocketChannel接收事件。但是,正如方法签名所建议的,您可以将ActorRef传递给curried参数,以便SocketChannel上发生的事件将由这个新的Actor处理

留给我们问题所有者添加的解决方案:

def receive = {
  case IO.NewClient(server) =>
      val client = context.actorOf(Props(new Client()))
      server.accept()(client) // Transferring ownership of the socket to a new Actor
      println("Client accepted")

  case IO.Read(socket, bytes) =>
      println("Server " + bytes)
}

你试过什么?确切的问题是什么?刚刚发现val socket=server.accept()需要是val socket=server.accept()(客户端),其中客户端是新创建的Actor。Akka团队与spray.IO团队合作设计的新IO层正在进行工作,这将更加灵活。当它出来的时候,你可能想调查一下。谢谢你的提示。看起来真的很酷。如果你有一个解决方案,你应该把它作为一个答案并接受它,这样我们就知道它已经解决了。