간단한 서버/클라이언트 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
메시지가 도착하지 :
당신이 localhost
와 XXX
를 교체 할 경우 작동합니다. 방화벽 문제로 인한 것 같아서 라우터에서 관련 TCP 및 UDP 포트를 전달하고 Windows 방화벽에서 열거 나 허용했습니다. 그래서 그 다음 코드는 작동했습니다 (또한 XXX
은 외부 IP로 바뀜). 시작된 ServerTest
은 ClientTest
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")
}
그래서 키우면되지 포트/방화벽 문제, 그것을 밤은?! 그래서 어디서 문제가 있습니까 ???
Akka Remoting은 방화벽이나 NAT를 다루지 않습니다. http://akka.io/faq/ –
@Viktor 제 질문에 대한 대답이지만, 소켓 버전이 가능한 이유와 akka가 아직 궁금합니다. –
@Viktor 제가 답변을 수락 할 수 있도록 의견을 게시 하시겠습니까?! –