2012-09-22 6 views
6

Próbuję skonfigurować prostą aplikację serwer/klient akka (przy użyciu Akka 2.0.3), ale nie udało się nawiązać połączenia. Wcześniej oto kod podstawowy:Uzyskaj prostą aplikację zdalnego dostępu do sieci Działa

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 

wiem, że konfiguracje powinny być umieszczone w zewnętrznych plikach.
Jeśli zastąpić XXX z localhost to działa:

started 
Got HEY 

Ale jeśli użyłem zewnętrznego (rozwiązany) IP komputera za routerem (domu) na XXX komunikat HEY nigdy nie nadejdzie. Pomyślałem, że to z powodu jakiegoś problemu z firewallem i przesłałem odpowiednie porty TCP i UDP do mojego routera, a także otworzyłem/zezwalałem na moją zaporę Windows. Więc po tym działał poniższy kod (także XXX zastąpiony moim zewnętrznym IP). Uruchomionym ServerTest można podłączyć przez 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") 
} 

więc jest to nie problem port/firewall, isnt to ?! Więc gdzie jest problem ???

+1

Akka Remoting nie ma do czynienia z firewalli lub NAT: http://akka.io/faq/ –

+0

@Viktor Chociaż its odpowiedzi na moje pytanie, mam wciąż zastanawiasz się dlaczego wersja gniazdko jest w stanie i Akka nie jest. –

+0

@Viktor Czy mógłbyś opublikować swój komentarz jako odpowiedź, abym mógł go zaakceptować ?! –

Odpowiedz

1

localhost zwykle oznacza 127.0.0.1, który jest tylko jednym z możliwie wielu interfejsów (kart) w komputerze. Powiązanie serwera z localhost nie będzie otrzymywać połączeń łączących się z innymi interfejsami (w tym z adresem zewnętrznym).

Należy podać adres zewnętrzny na serwerze lub 0.0.0.0, co oznacza "powiązanie ze wszystkimi interfejsami".

+1

Wiązanie serwera z adresem zewnętrznym kończy się niepowodzeniem z "Wyjątkiem w wątku" głównym "org.jboss.netty.channel.ChannelException: Nie można powiązać z: /84.187.XXX.XXX: 5678', więc spróbowałem '0.0.0.0', które wiąże, ale nie otrzymuje komunikatu' HEY'. To samo z '192.168.2.101', adresem IP mojego interfejsu LAN (karty), który jest podłączony do routera. Jakieś nowe myśli? –

+0

Przy okazji. '0.0.0.0' ma sens w porównaniu z' println (new ServerSocket (5678)), który daje 'ServerSocket [addr = 0.0.0.0/0.0.0.0, port = 0, localport = 5678]'. –