2012-09-22 2 views
6

간단한 서버/클라이언트 akka (Akka 2.0.3 사용) 응용 프로그램을 설정하려고하는데 연결하지 못했습니다. 기본 코드는 다음과 같습니다.간단한 원격 Akka 응용 프로그램 실행 실행

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 

구성이 외부 파일에 있어야한다는 것을 알고 있습니다.

started 
Got HEY 

을하지만 XXX 내 외부 (해결) IP (홈 라우터 뒤에 PC)를 사용하는 경우 HEY 메시지가 도착하지 :
당신이 localhostXXX를 교체 할 경우 작동합니다. 방화벽 문제로 인한 것 같아서 라우터에서 관련 TCP 및 UDP 포트를 전달하고 Windows 방화벽에서 열거 나 허용했습니다. 그래서 그 다음 코드는 작동했습니다 (또한 XXX은 외부 IP로 바뀜). 시작된 ServerTestClientTest a로 연결할 수 있습니다

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

그래서 키우면되지 포트/방화벽 문제, 그것을 밤은?! 그래서 어디서 문제가 있습니까 ???

+1

Akka Remoting은 방화벽이나 NAT를 다루지 않습니다. http://akka.io/faq/ –

+0

@Viktor 제 질문에 대한 대답이지만, 소켓 버전이 가능한 이유와 akka가 아직 궁금합니다. –

+0

@Viktor 제가 답변을 수락 할 수 있도록 의견을 게시 하시겠습니까?! –

답변

1

localhost은 일반적으로 컴퓨터에서 가능한 많은 인터페이스 (카드) 중 하나 인 127.0.0.1을 의미합니다. localhost에 바인드하는 서버는 다른 인터페이스 (외부 주소가있는 인터페이스 포함)에 연결하는 연결을 수신하지 않습니다.

서버에 외부 주소를 지정하거나 "모든 인터페이스에 바인딩"을 의미하는 0.0.0.0을 지정해야합니다.

+1

서버를 외부 주소에 바인드하는 것은'예외 "주"org.jboss.netty.channel.ChannelException : 바인드 실패 : /84.187.XXX.XXX : 5678'로 실패합니다. 'HEY' 메시지를 받는데'0.0.0.0'은 바인딩하지만 HEY 메시지는 수신하지 않습니다. 라우터에 연결된 LAN 인터페이스 (카드)의 IP 주소 인 192.168.2.101과 동일합니다. 그래서 새로운 생각? –

+0

그건 그렇고. '0.0.0.0'은'ServerSocket [addr = 0.0.0.0/0.0.0.0, port = 0, localport = 5678]'을 산출하는'println (새로운 ServerSocket (5678))'에 비해 의미가 있습니다. –