2012-09-22 26 views
6

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???

+1

Akka Từ chối không xử lý tường lửa hoặc NAT: http://akka.io/faq/ –

+0

@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. –

+0

@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 ?! –

Trả lời

1

localhost thường có nghĩa là 127.0.0.1, chỉ là một trong số nhiều giao diện (thẻ) trong máy tính. Máy chủ liên kết với localhost sẽ không nhận được các kết nối kết nối với các giao diện khác (bao gồm cả kết nối với địa chỉ bên ngoài).

Bạn phải chỉ định địa chỉ bên ngoài trong máy chủ hoặc 0.0.0.0 có nghĩa là "liên kết với tất cả giao diện".

+1

Việc kết nối máy chủ với địa chỉ bên ngoài không thành công với "Ngoại lệ trong chuỗi" chính "org.jboss.netty.channel.ChannelException: Không thể liên kết với: /84.187.XXX.XXX: 5678', vì vậy tôi đã thử '0.0.0.0' liên kết nhưng không nhận được thông điệp' HEY'. Tương tự với '192.168.2.101', địa chỉ IP của giao diện LAN (thẻ) của tôi được kết nối với bộ định tuyến. Vì vậy, bất kỳ suy nghĩ mới? –

+0

Nhân tiện. '0.0.0.0' có ý nghĩa so với' println (new ServerSocket (5678)) 'cho ra' ServerSocket [addr = 0.0.0.0/0.0.0.0, port = 0, localport = 5678] '. –

Các vấn đề liên quan