Tôi đang cố cài đặt ứng dụng máy chủ/ứng dụng khách đơn giản (sử dụng Akka 2.0.3) nhưng không thể kết nối. Trước đây là mã cơ bản:Tải ứng dụng Akka đơn giản từ xa chạy
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
Tôi biết rằng các cấu hình nên được đặt trong các tệp bên ngoài.
Nếu bạn thay thế XXX
với localhost
nó hoạt động:
started
Got HEY
Nhưng nếu tôi sử dụng bên ngoài IP (giải quyết) của tôi (PC đằng sau router nhà) cho XXX
thông điệp HEY
không bao giờ đến. Tôi nghĩ rằng đó là do một số vấn đề tường lửa và chuyển tiếp các cổng TCP và UDP liên quan tại router của tôi và cũng đã mở/cho phép chúng tại tường lửa Windows của tôi. Vì vậy, sau đó mã sau làm việc (cũng XXX
thay thế bằng IP bên ngoài của tôi). Một ServerTest
bắt đầu có thể được nối với nhau bằng một 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")
}
Vì vậy, nó không phải là một vấn đề cảng/tường lửa, isn't nó ?! Vậy vấn đề nằm ở đâu???
Akka Từ chối không xử lý tường lửa hoặc NAT: http://akka.io/faq/ –
@Viktor Mặc dù câu trả lời của tôi là câu hỏi của tôi, tôi vẫn tự hỏi tại sao phiên bản socket có khả năng và akka thì không. –
@Viktor Bạn có nhớ đăng bình luận của mình làm câu trả lời để tôi có thể chấp nhận nó không ?! –