2012-09-22 10 views
6

Sto provando a configurare una semplice applicazione server/client akka (utilizzando Akka 2.0.3), ma non è riuscita a connettersi. Precedentemente ecco il codice base:Ottenere un'applicazione remota Akka semplice in esecuzione

import com.typesafe.config.ConfigFactory 
import akka.actor.Actor 
import akka.actor.ActorSystem 
import akka.actor.Props 

class Server extends Actor { 
    def receive = { 
    case s: String => println("Got " + s) 
    } 
} 

val serverSystem = ActorSystem("server", ConfigFactory.load(ConfigFactory.parseString(""" 
    akka { 
    actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
    } 
    remote { 
     transport = "akka.remote.netty.NettyRemoteTransport" 
     netty { 
     hostname = "localhost" 
     port = 5678 
     } 
    } 
    } 
"""))) 

val server = serverSystem.actorOf(Props[Server], name = "server") 
Thread.sleep(500) 
println("started") 
Thread.sleep(500) 

val clientSystem = ActorSystem("client", ConfigFactory.load(ConfigFactory.parseString(""" 
    akka { 
    actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
    } 
    } 
"""))) 
val remoteServer = clientSystem.actorFor("akka://[email protected]:5678/user/server") 

remoteServer ! "HEY" 

Thread.sleep(3000) 
clientSystem.shutdown 
serverSystem.shutdown 

So che le configurazioni devono essere inserite in file esterni.
Se si sostituisce XXX con localhost funziona:

started 
Got HEY 

Ma se ho usato il mio IP esterno (risolto) (PC dietro il router di casa) per XXX il messaggio HEY non arriva mai. Ho pensato che fosse dovuto a qualche problema con il firewall e ho inoltrato le relative porte TCP e UDP sul mio router e aperto/permesso sul mio firewall Windows. Quindi dopo che il codice seguente ha funzionato (anche XXX sostituito con il mio IP esterno). Un iniziato ServerTest può essere collegato da un ClientTest:

import java.net.ServerSocket 
object ServerTest extends App { 
    println("START server") 
    val ss = new ServerSocket(5678) 
    val s = ss.accept() 
    println(s) 
    println("END") 
} 

import java.net.Socket 
object ClientTest extends App { 
    println("START client") 
    val s = new Socket("XXX", 5678) 
    println(s) 
    println("END") 
} 

Quindi E'non è un problema di porta/firewall, purtroppo non si è ?! Quindi dov'è il problema???

+1

Akka Remoting non ha a che fare con firewall o NAT: http://akka.io/faq/ –

+0

@Viktor Sebbene risponda alla mia domanda, mi chiedo ancora perché la versione socket sia in grado e akka no. –

+0

@Viktor Ti dispiacerebbe pubblicare il tuo commento come risposta in modo che io possa accettarlo ?! –

risposta

1

localhost significa in genere 127.0.0.1, che è solo una delle possibili interfacce (schede) in un computer. Il server che si collega a localhost non riceverà connessioni che si connettono alle altre interfacce (inclusa quella con l'indirizzo esterno).

È necessario specificare l'indirizzo esterno nel server oppure 0.0.0.0 che significa "esegui il collegamento a tutte le interfacce".

+1

Il binding del server con l'indirizzo esterno non riesce con "Eccezione nel thread" principale "org.jboss.netty.channel.ChannelException: Impossibile eseguire il binding a: /84.187.XXX.XXX: 5678', quindi ho provato il tuo '0.0.0.0' che si collega ma non riceve il messaggio' HEY'. Lo stesso con '192.168.2.101', l'indirizzo IP della mia interfaccia LAN (scheda) che è collegata al router. Quindi qualche nuovo pensiero? –

+0

A proposito. '0.0.0.0' ha senso rispetto a' println (new ServerSocket (5678)) 'che produce' ServerSocket [addr = 0.0.0.0/0.0.0.0, port = 0, localport = 5678] '. –

Problemi correlati