Scala Akka 2.2.3 TCP客户端未报告连接已关闭

Scala Akka 2.2.3 TCP客户端未报告连接已关闭,scala,akka,Scala,Akka,我可以使用Akka I/O连接到ServerSocket,但是当我关闭套接字时,我没有看到任何类型的ConnectionClosed消息返回 第一次试验通过,但第二次试验未通过(2.2.3和2.3.0-RC2): [错误]“已连接(localhost/127.0.0.1:59141,/127.0.0.1:54809)”不是“akka.io.Tcp$ConnectionClosed”的实例(AkkaTcpTests.scala:46) 谢谢你的帮助。看看 您的侦听器必须在接收任何进一步的TCP消息

我可以使用Akka I/O连接到
ServerSocket
,但是当我关闭套接字时,我没有看到任何类型的
ConnectionClosed
消息返回

第一次试验通过,但第二次试验未通过(2.2.3和2.3.0-RC2):

[错误]“已连接(localhost/127.0.0.1:59141,/127.0.0.1:54809)”不是“akka.io.Tcp$ConnectionClosed”的实例(AkkaTcpTests.scala:46)

谢谢你的帮助。

看看

您的侦听器必须在接收任何进一步的TCP消息之前向连接注册自身:

要激活新连接,必须发送注册信息 发送给连接参与者,通知该参与者 从套接字接收数据。完成此步骤之前,请先断开连接 无法使用,并且存在一个内部超时,在该超时之后 如果未收到任何注册消息,连接参与者将自行关闭 收到

在侦听器的接收块中添加

case c @ Connected(remote, local) =>
  val connection = sender
  connection ! Register(self)
  // change behaviour with become, notify someone, ...

Edit:正如罗兰指出的,在给定的场景中,还需要在
ServerSocket
上调用
accept()
,它返回一个套接字,然后调用
close()
,以触发
PeerClosed
消息(这是[Tcp.ConnectionClosed]的实例)。如果在ServerSocket上调用
close()
,则在关闭服务器连接时会引发错误。但通常在使用Akk IO时不必处理此级别。

关闭
ServerSocket
不会终止它所接受的连接,您必须通过调用
accept()
获得
Socket
,然后关闭该套接字以断开连接

除了卡斯滕给出的答案之外,还需要这一点

case c @ Connected(remote, local) =>
  val connection = sender
  connection ! Register(self)
  // change behaviour with become, notify someone, ...