【问题标题】:Akka Actor can't connect to remote server where Scala Actor couldAkka Actor 无法连接到 Scala Actor 可以连接的远程服务器
【发布时间】:2011-03-16 13:27:50
【问题描述】:

我遇到了一个小问题。我刚刚将我当前项目的客户端-服务器通信从远程 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) 阿卡1.0

我知道您无法调试我的代码,但如果您能提供任何提示或想法,我将非常感谢这里可能出了什么问题。

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

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    免责声明:我是 Akka 的 PO

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

    1. 确保双方可以 DNS 相互解析
    2. 升级到 当前主机(1.1-SNAPSHOT),因为 我做了很多改变 避免名称解析。

    这有帮助吗?

    【讨论】:

    • 嗨,维克多,感谢您抽出宝贵时间。你是指哪个remote.start()?在服务器中,我尝试了“localhost”和“127.0.0.1”以及外部 IP。在客户端中,我实际上使用“localhost”。会尝试。至于使用 1.1 版:它是否相当稳定?遗憾的是,我只能在星期五向您提供反馈,因为那是我第一次可以向我的客户发送新代码。
    • 正如我所料,它会尝试进行反向查找。我认为你最好尝试 1.1-SNAPSHOT,我们将在一两周内发布 RC1,所以它“几乎就在那里”。
    • 谢谢维克托。我尝试按照您的网站上的描述编译 1.1 (origin master),但失败了(似乎是 scala 2.7 vs 2.8 的问题)。我的客户昨天想要他的产品(字面意思;))。所以恐怕等待不是一种选择。猜猜我将不得不降级为普通的scala演员。但在我的客户第一次希望改变时,我会尝试再次升级。伤心。但是感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多