Akka Actor无法连接到Scala Actor可以使用的远程服务器

时间:2011-03-16 13:27:51

标签: scala akka

我有点问题。我刚刚将当前项目的客户端 - 服务器通信从远程Scala Actors移动到远程Akka Actors。

在我的本地计算机上进行测试时,一切正常但是一旦我尝试在不同的计算机上运行客户端和服务器的代码,客户端就再也无法访问服务器了(我得到了java.nio.channels.NotYetConnectedException)。我加倍检查正在使用的ip和端口。这与我在Scala演员代码中使用的主机数据相同(顺便说一下,这仍然有用。所以在防火墙设置上没有任何改变,服务器在技术上是可以访问的)

以下是代码的重要部分(我主要从akkas主页复制粘贴):

在服务器角色

import akka.actor.Actor._
import akka.actor.{Actor, ActorRef, Supervisor}

override def preStart = {

  // I also tried the servers external ip here 
  remote.start(host, 1357) 

  // SERVER_SERVICE_NAME is a string constant in a trait that both server
  // and client extend
  // all actual work is refered to SessionActor
  remote.registerPerSession(SERVER_SERVICE_NAME, actorOf[SessionActor])
}

并在客户端:

import akka.actor.Actor._
import akka.actor.{Actor, ActorRef, Supervisor}

override def preStart = {

  // CLIENT_SERVICE_NAME is a string constant
  Actor.remote.start("localhost", 5678).register(CLIENT_SERVICE_NAME, self)

  // I also tried "Thread sleep 1000" here just in case

  // internalServer is a private var of the type Option[ActorRef]
  // host and serverPort are actually read from a propertiesfile. Guess this
  // doesn't matter. I checked them.
  internalServer = Some(
    remote.actorFor(SERVER_SERVICE_NAME, host, serverPort)
  )

  // Again I tried "Thread sleep 1000" here. Didn't help neither

  internalServer foreach (server => {
    (server !! Ping) foreach (_ match { // !!! this is where the exception is thrown !!!
        case Pong   => println("connected")
        case _      => println("something's fishy")
      })
    })

}

我正在使用: Scala 2.8.1(虽然我不确定我客户端的机器是2.8还是2.8.1,但是我使用了akka发行版中的scala-library.jar) Akka 1.0

我知道你无法调试我的代码,但我非常感谢任何暗示或想法,这里可能会出现问题。

P.S。:在尝试发送Ping后,在一瞬间抛出异常。所以我没有费心增加超时时间。

1 个答案:

答案 0 :(得分:4)

免责声明:我是Akka的PO

尝试在remote.start()中使用原始IP地址而不是主机名,如果不解决它,您有2个选项:

  1. 确保双方都可以 DNS解决彼此
  2. 升级到 当前大师(1.1-SNAPSHOT),自此 我做了很多改动 避免名称解析。
  3. 这有帮助吗?