在使用Scala和Akka IO时,有没有一种方法可以让Actor严格用于侦听,然后在建立连接时创建一个新的actor,然后负责该套接字(读取、写入等)?
到目前为止,我已经有了这个。问题是服务器执行元正在接收数据。我希望将套接字的所有权转移给新创建的客户端参与者,以便它接收与套接字相关的任何消息。有人知道怎么做吗?
编辑:添加解决方案。我只需要将ActorRef传递到accept的curried参数中
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))
}
}
谢谢!
发布于 2013-12-13 20:20:30
为了让答案更明显一点:
在ServerHandle
的Akka documentation中:
def accept ()(implicit socketOwner: ActorRef): SocketHandle
应接收与SocketChannel关联的事件的
socketOwner ActorRef。当前执行元的ActorRef将被隐式使用。
如果没有向current参数传递任何内容(仅调用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)
}
https://stackoverflow.com/questions/14408273
复制相似问题