阿克卡演员可以';t连接到Scala Actor可以访问的远程服务器

阿克卡演员可以';t连接到Scala Actor可以访问的远程服务器,scala,akka,Scala,Akka,我有点小问题。我刚刚将当前项目的客户机-服务器通信从远程Scala参与者移动到远程Akka参与者 在本地机器上进行测试时,一切正常,但一旦我尝试在不同的机器上使用客户端和服务器运行代码,客户端就无法再访问服务器了(我得到了一个java.nio.channels.NotYetConnectedException)。我仔细检查了正在使用的ip和端口。这和我在Scala actors代码中使用的主机数据是一样的(顺便说一句,它仍然有效。所以显然防火墙设置没有任何变化,服务器在技术上是可以访问的) 以下

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

在本地机器上进行测试时,一切正常,但一旦我尝试在不同的机器上使用客户端和服务器运行代码,客户端就无法再访问服务器了(我得到了一个
java.nio.channels.NotYetConnectedException
)。我仔细检查了正在使用的ip和端口。这和我在Scala actors代码中使用的主机数据是一样的(顺便说一句,它仍然有效。所以显然防火墙设置没有任何变化,服务器在技术上是可以访问的)

以下是代码的重要部分(我主要从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) 阿克卡1.0

我知道你不能帮她调试我的代码,但我非常感谢你能给我任何提示或想法,告诉我这里可能出了什么问题


注意:尝试发送
Ping
后,异常在一秒钟内抛出。所以我没有费心增加超时时间。

免责声明:我是阿克卡的PO

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

  • 确保双方能够 互相解决
  • 升级到 当前主机(1.1-SNAPSHOT),自 我对这本书做了不少修改 避免名称解析

  • 这有用吗?

    嗨,维克多,谢谢你抽出时间。你是说哪个
    remote.start()
    ?在服务器中,我尝试了“localhost”和“127.0.0.1”以及外部IP。在客户机中,我实际上使用了“localhost”。我会努力的。至于使用1.1版:它是否相当稳定?遗憾的是,我只能在周五向您提供反馈,因为这是我第一次向我的客户发送新代码。正如我所料,它将尝试进行反向查找。我想你最好试试1.1-SNAPSHOT,我们会在一两周内发布RC1,所以它“就快到了”。谢谢你,维克多。我尝试按照您网站上的描述编译1.1(源代码母版),但失败了(似乎是scala 2.7和2.8的问题)。我的客户昨天想要他的产品。所以我恐怕不能等待。我想我必须降级到普通的scala演员。但我会在我的客户最初希望改变的时候再次尝试升级。悲哀的但是谢谢你的帮助。