2011-04-21 77 views
1

我写了使用Scala的远程参与者的程序。我的第一步是创建一个通过环回(127.0.0.1)进行通信的客户端和服务器,并且它运行良好。当我尝试在同一网络上的两个工作站之间进行通信时,服务器不会捕获任何东西。我在本地和远程客户端程序之间改变的唯一一件事是服务器的IP地址。远程演员的工作只能在本地主机

下面是客户端代码:

case class Post(msg: String) 

object Client extends Application { 
    val client = new ClientRemote 
    client.sendMessage 
} 

class ClientRemote extends Actor { 
    val server = select(Node("127.0.0.1", 9010), 'name) //' or server IP 

    def sendMessage(): Unit = { 
    server ! Post("Hello!") 
    } 

    def act() { 
    // do something 
    } 
} 

这里是服务器代码:

case class Post(msg: String) 

object Server extends Application { 
    val server = new ServerRemote 
    server.start 
} 

class ServerRemote extends Actor { 
    def act() { 
    alive(9010) 
    println("server is started!") 
    register('name, self)     //' register to port 
    loop { 
     react { 
     case Post(msg) => println(msg) 
     } 
    } 
    } 
} 

有谁知道为什么这些程序不”工作或有关解决方案的任何想法?

感谢

回答

0

我知道更多关于Java比我做的斯卡拉,但是它可能是你的类案例类的重复定义被类加载器视为不同的类?您的评论

0

您可以在客户端和服务器代码的开头加上“scala.actors.Debug.level = 3”中获得什么演员子系统正在做的更多信息。这会告诉你,例如,如果收到的消息,但掉落,或者其监听比你想象的不同端口上,等

+0

谢谢,这是非常有益的。 错误是:抓java.io.InvalidClassException:scala.actors.remote.Node;局部类不兼容:流classdesc的serialVersionUID = -4252948855987918585,本地类的serialVersionUID = -7525549079045563153 我认为这是一个序列化的问题。 – reevolt 2011-04-26 10:23:42

+0

我认为这将指出乌米在另一个答案中所说的。 Post类是分开定义的两次,所以每个版本都有自己的UID。相反,定义Post一次,并将该类文件包含在服务器和客户端中。 – Kevin 2011-04-26 22:29:43

+0

谢谢你,我会尝试 – reevolt 2011-04-28 08:34:26

相关问题