Akka TCP IO向我发送两次连接消息

时间:2016-12-11 06:52:01

标签: scala tcp akka

我有一个简单的客户端服务器程序 服务器监听如下

val manager = IO(Tcp)    
manager ! Bind(self, myAddress,1,options)

然后在接收循环中

override def receive = {
case b @ Bound(addr) => 
      {
       log.info("bound")
       myAddress = addr       
       bBound = true
      }
case c @ Connected(remoteAddress,localAddress) => 
log.info("Client Connected. Remote: {} Local: {}", remoteAddress, localAddress)
myAPAddress = remoteAddress
remoteConnection = sender()
remoteConnection ! Register(self,keepOpenOnPeerClosed=true)
//first thing to do is to register yourself with a lookup
mLookupManager ! AddMe(myAddress, this.context.self.path)

然而,正在接收两次连接消息。 服务器actor没有重新启动,因为我重载了preRestart并且没有被调用。问题是查找管理器查找并且如果找到具有相同套接字地址的actor路径,则向其发送毒丸。然后添加新的演员。 但是在这种情况下,它会杀死同一个actor并添加它的actorpath 为什么我会两次收到连接消息?任何线索?

1 个答案:

答案 0 :(得分:0)

Bind成功完成(你得到Bound后)服务器角色时,它将为每个与套接字建立的新连接收到Connect消息。

常见的模式是让Connect消息触发创建一个新的actor,负责与该特定客户端交互,而不是让#34;服务器"演员正在进行互动。

请参阅此处的文档以获取完全相同的示例:http://doc.akka.io/docs/akka/2.4.14/scala/io-tcp.html#Accepting_connections