2013-01-18 33 views
16

Sử dụng Scala với Akka IO có cách nào để diễn viên hoàn toàn lắng nghe và sau đó khi kết nối được thiết lập, hãy tạo một diễn viên mới sau đó sẽ chịu trách nhiệm về Socket (Đọc, Viết, v.v ...)?Akka Socket cho mỗi diễn viên

Cho đến giờ tôi có điều này. Vấn đề là diễn viên máy chủ đang nhận dữ liệu. Tôi muốn chuyển quyền sở hữu ổ cắm cho tác nhân Khách hàng mới được tạo ra để nó nhận được bất kỳ thông báo nào liên quan đến socket. Có ai biết làm như thế nào không?

Chỉnh sửa: giải pháp được thêm vào. Tôi chỉ cần chuyển ActorRef vào thông số được chấp nhận của chấp nhận

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

} 

Cảm ơn!

+0

những gì đã cố gắng của bạn? vấn đề chính xác là gì? –

+0

Chỉ cần tìm ra val socket = server.accept() cần phải là val socket = server.accept() (client) trong đó client là tác nhân mới được tạo – tkblackbelt

+5

Có công việc đang diễn ra trên một lớp IO mới mà nhóm Akka thiết kế phối hợp với nhóm spray.io sẽ linh hoạt hơn nhiều. Bạn có thể muốn xem xét điều đó khi nó xuất hiện. –

Trả lời

3

Để thực hiện các câu trả lời một chút rõ ràng hơn:

Từ Akka documentation cho ServerHandle:

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

socketOwner ActorRef rằng sẽ nhận được sự kiện liên quan đến việc SocketChannel. ActorRef cho diễn viên hiện tại sẽ được sử dụng hoàn toàn.

Nếu không có gì được truyền cho các tham số cà ri (chỉ gọi server.accept()), Actor hiện hành (Server) sẽ nhận được các sự kiện từ SocketChannel. Tuy nhiên, như chữ ký phương thức gợi ý, bạn có thể truyền một ActorRef đến tham số curried để các sự kiện xảy ra trên SocketChannel sẽ được xử lý bởi Actor mới này.

Rời chúng ta đến giải pháp bổ sung bởi các chủ sở hữu của câu hỏi:

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) 
} 
Các vấn đề liên quan