2016-07-04 9 views
0

Я изучаю, как создать простой сервер сокетов для вещания в Akka и Scala, я до сих пор закончил и может обрабатывать базовое подключение сокета от моего клиента тестирования. Вот код.Простой широковещательный сервер сокетов в Akka и 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) 



} 

Для того, чтобы сделать радиопередачу я собираюсь реализовать HashMap и добавить ActorRef любого нового подключения к HashMap. Проблема i m сталкивается: я создал HashMap в классе SocketServer, и я не могу просто получить доступ к нему внутри класса TestHandler, где находится полученный (данные).

Я новичок в Scala/Akka, поэтому простите меня, если я попробую что-то глупое.

+0

Если ответ полезным сделает голосование, если не комментировать по-крайней мере, не оставить его как пустой. – aravindKrishna

ответ

0

Вы можете создать сопутствующий объект для SocketServer.

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

вы можете использовать любого SokcetServer.connections где в одном модуле becoz SokcetServer является одноплодным объекта.

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