2013-01-18 8 views
16

アクカIOでのScalaの使用は、アクタを厳重にリスニングしてから接続が確立されると、そのソケット(リーディング、ライティングなど)を担当する新しいアクタを作成する方法ですか?アクターごとのアクセルソケット

これまでのところ私はこれを持っています。問題は、サーバーアクターがデータを受信して​​いることです。ソケットに関連するメッセージを受け取れるように、ソケットの所有権を新しい作成されたClientアクタに転送したいと思います。誰でもそのことを知っていますか?

編集:追加された解決策。 ActorRefを受け取りのカレーのパラメータに渡すだけでした。

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)) 
    } 

} 

ありがとう!

+0

質問の掲載したソリューションに私たちを残して?正確な問題は何ですか? –

+0

ちょっと分かりました。valソケット= server.accept()はval socket = server.accept()(クライアント)である必要があります。クライアントは新しく作成されたアクタです – tkblackbelt

+5

Akkaチームが設計した新しいIOレイヤで作業が行われていますより柔軟性の高いspray.ioチームと協力しています。あなたはそれが出てくるときにそれを調べることがあります。 –

答えて

3

答えがもう少し見えるようにする:

Akka documentationからServerHandleのために:のSocketChannelに関連したイベントを受け取る必要があります

def accept()(implicit socketOwner: ActorRef): SocketHandle 

socketOwner ActorRef。現在のActorのActorRefは暗黙的に として使用されます。

カルトパラメーターに何も渡されない場合(server.accept()のみを呼び出す)、現在のアクター(サーバー)はSocketChannelからイベントを受け取ります。ただし、メソッドのシグネチャが示唆するように、SocketChannelで発生するイベントがこの新しいActorによって処理されるように、カルトパラメーターにActorRefを渡すことができます。あなたの試してみました何

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) 
} 
関連する問題