Scala Akka 2.2.3 TCP客户端未报告连接已关闭
我可以使用Akka I/O连接到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消息
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, ...