2012-09-22 4 views
6

Ich versuche, eine einfache Server/Client-akka (mit Akka 2.0.3) -Anwendung einzurichten, aber es konnte keine Verbindung hergestellt werden. Zuvor ist hier der Grundcode:Get Simple Remote Akka-Anwendung ausgeführt

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 

Ich weiß, dass die Konfigurationen in externen Dateien platziert werden sollten.
Wenn Sie XXX mit localhost ersetzen es funktioniert:

started 
Got HEY 

Aber wenn ich meine externe (aufgelöst) IP (PC hinter der Home-Router) verwendet für XXX die HEY Nachricht kommt nie an. Ich dachte, es liegt an einem Firewallproblem und hat die zugehörigen TCP- und UDP-Ports an meinem Router weitergeleitet und auch an meiner Windows-Firewall geöffnet/erlaubt. Danach funktionierte folgender Code (auch XXX ersetzt durch meine externe IP).

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

So es ist nicht ein Port/Firewall-Problem, nicht wahr ?!: A gestartet ServerTest kann durch eine ClientTest angeschlossen werden Also wo ist das Problem ???

+1

Akka Remoting befasst sich nicht mit Firewalls oder NAT: http://akka.io/faq/ –

+0

@Viktor Obwohl es meine Frage beantwortet, frage ich mich immer noch, warum die Socket-Version in der Lage ist und akka nicht. –

+0

@Viktor Würde es dir etwas ausmachen, deinen Kommentar als Antwort zu posten, damit ich ihn akzeptieren kann ?! –

Antwort

1

localhost bedeutet normalerweise 127.0.0.1, die nur eine der möglicherweise vielen Schnittstellen (Karten) in einem Computer ist. Die Serverbindung an localhost erhält keine Verbindungen zu den anderen Schnittstellen (einschließlich der mit der externen Adresse).

Sie sollten entweder die externe Adresse im Server angeben, oder 0.0.0.0, was "an alle Schnittstellen binden" bedeutet.

+1

Das Binden des Servers an die externe Adresse schlägt mit 'Ausnahme im Thread' fehl. 'org.jboss.nety.channel.ChannelException: Fehler beim Binden an: /84.187.XXX.XXX: 5678', also habe ich Ihr versucht '0.0.0.0', die die HEY-Nachricht bindet, aber nicht empfängt. Das selbe mit '192.168.2.101', der IP-Adresse meiner LAN-Schnittstelle (Karte) die mit dem Router verbunden ist. Also irgendwelche neuen Gedanken? –

+0

Übrigens. '0.0.0.0' ist sinnvoll im Vergleich zu' println (neuer ServerSocket (5678)) 'was' ServerSocket [addr = 0.0.0.0/0.0.0.0, port = 0, localport = 5678] 'ergibt. –

Verwandte Themen