2016-07-04 23 views
0

Ich lerne, wie man einfache Sende-Socket-Server in Akka und Scala baut, ich habe unten so weit abgeschlossen und es kann grundlegende Socket-Verbindung von meinem Test-Client verarbeiten. Hier ist der Code.Einfacher Sende-Socket-Server in Akka und Scala

import akka.actor.{Actor,ActorRef,Props,Inbox,ActorSystem} 
import akka.io.{IO,Tcp} 
import java.net.InetSocketAddress 


class TestHandler extends Actor{ 
import Tcp._ 

def receive={ 
    case Received(data) => 
     println (data received in TestHandler") 
     // How can I broadcast the message to all connected client here? 

    case PeerClosed => 
     println ("Client closed the connection") 
     context stop self 

} 

} 

class SocketServer extends Actor{ 

import Tcp._ 
import context.system 

val connections = new HashMap[String,ActorRef] 

IO(Tcp) ! Bind(self,new InetSocketAddress("localhost",8000)) 

def receive ={ 
    case Connected(remote,local) => //new connection 
     println("connected") 
     //create new handler and register it 
     val handler = context.actorOf(Props[TestHandler]) 
     val connection = sender() 
     println (s"new connection from $connection") 
     // Add the new connection to the HashMap 
     connection ! Tcp.Register(handler) 
} 


} 



object SocketServerTest extends App { 

val system = ActorSystem("SocketServer") 
val server = system.actorOf(Props[SocketServer],"Myserver") 
val inbox = Inbox.create(system) 



} 

Um eine Sendung Ich werde einen HashMap implementieren und fügen Sie die ActorRef jeder neuen Verbindung zum HashMap zu tun. Das Problem, dem ich gegenüberstehe, ist: Ich habe die HashMap in der SocketServer-Klasse erstellt und kann nicht einfach darauf innerhalb der TestHandler-Klasse zugreifen, in der sich die empfangene (Daten) befindet.

Ich bin neu auf Scala/Akka also vergib mir, wenn ich etwas dummes gefragt habe.

+0

Wenn die Antwort nützlich machen Abstimmung, wenn nicht kommentieren at-least, es ist nicht so leer lassen. – aravindKrishna

Antwort

0

Sie können Companion-Objekt für SocketServer wie erstellen.

object SocketServer{ 
val connections = new HashMap[String,ActorRef] 
} 

können Sie verwenden SokcetServer.connections, wo jeder in demselben Modul becoz SokcetServer ist Singletons Objekt.

don't forget to push actorref map under connected(r,l)