2012-09-22 22 views
6

Estoy tratando de configurar una aplicación simple de servidor/cliente akka (usando Akka 2.0.3), pero no se pudo conectar. De antemano aquí está el código básico:Obtener la aplicación Akka remota simple Ejecutando

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 

Sé que las configuraciones deben colocarse en archivos externos.
Si reemplaza XXX con localhost funciona:

started 
Got HEY 

Pero si he usado mi IP externa (resueltos) (PC detrás de router) para XXX el mensaje HEY nunca llega. Pensé que se debía a un problema de firewall y reenvío los puertos TCP y UDP relacionados a mi enrutador y también los abrí/los permití en mi firewall de Windows. Así que después de que el siguiente código funcionó (también XXX reemplazado con mi IP externa). Un iniciado ServerTest se pueden conectar por 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") 
} 

así que es no es un problema puerto/servidor de seguridad, ¿o no ?! ¿¿¿Entonces, dónde está el problema???

+1

Akka Remoting no trata con firewalls o NAT: http://akka.io/faq/ –

+0

@Viktor Aunque responde mi pregunta, todavía me pregunto por qué la versión de socket es capaz y akka no. –

+0

@Viktor ¿Te importaría publicar tu comentario como respuesta para que yo pueda aceptarlo? –

Respuesta

1

localhost generalmente significa 127.0.0.1, que es solo una de las posibles muchas interfaces (tarjetas) en una computadora. El enlace del servidor a localhost no recibirá conexiones conectadas a las otras interfaces (incluida la que tiene la dirección externa).

Debe especificar la dirección externa en el servidor, o 0.0.0.0 que significa "enlazar a todas las interfaces".

+1

El enlace del servidor a la dirección externa falla con 'Exception in thread' main "org.jboss.netty.channel.ChannelException: No se pudo vincular a: /84.187.XXX.XXX: 5678', así que probé su '0.0.0.0' que se une pero no recibe el mensaje 'HEY'. Lo mismo con '192.168.2.101', la dirección IP de mi interfaz LAN (tarjeta) que está conectada al enrutador. ¿Alguna idea nueva? –

+0

Por cierto. '0.0.0.0' tiene sentido en comparación con' println (new ServerSocket (5678)) 'que produce' ServerSocket [addr = 0.0.0.0/0.0.0.0, port = 0, localport = 5678] '. –

Cuestiones relacionadas