我正在使用 akka-io 创建一个通过套接字与非 jvm tcp(非 akka)服务器通信的 Tcp 客户端 Actor。因为 akka-io 发送ByteString
并且程序期望定期String
输出给它,所以ByteString
消息永远不会被处理。一个非常粗糙的基于java的方法实际上是有效的:
override def receive: Receive = {
case ClientTcpActor.Start =>
val socket = new Socket(socketAddress.getHostName, socketAddress.getPort)
val out = new PrintWriter(socket.getOutputStream, true)
out.println("Hello World!")
import java.io.BufferedReader
import java.io.InputStreamReader
val is = socket.getInputStream
val isr = new InputStreamReader(is)
val br = new BufferedReader(isr)
val message = br.readLine
println(s"Message received from the server : $message")
}
我能够向 tcp 端口发送消息并收到回复。
但是,这种 akka-io 方法不起作用。具体来说,我从不从套接字接收数据,因为外部应用程序无法处理对象ByteString
发送的数据Write
def receive: PartialFunction[Any, Unit] = {
case CommandFailed(_: Connect) =>
log.info("Connection failed.")
context stop self
case c@Connected(_, _) =>
log.info("Connect succeeded.")
val connection = sender()
connection ! Register(self)
val message = ByteString("hello world")
log.info(s"Sending request message ${message}")
connection ! Write(message)
case Received(data) =>
log.info(data.toString())
case _: ConnectionClosed =>
log.info("Connected is closed!")
case _ =>
log.info("Something else is up.")
}
我还创建了自己的 akka-IO 服务器应用程序,该应用程序在同一端口上处理数据并验证我实际上是在向该端口发送消息,但是需要 akka 服务器参与者来处理ByteString
我希望这是一些我忽略的简单修复。