我正在使用akka-io创建一个Tcp客户端Actor,它通过套接字与非jvm(非akka)服务器通信。因为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的解码。
我希望这是我忽略的一些简单的解决办法。
发布于 2017-05-12 14:03:25
在网络上,没有String或ByteString这样的东西,只有字节。ByteString本质上只是字节数组的包装器,以确保它们不发生变异(因为这样做需要同步,才能在线程/参与者之间安全地共享)。当您从一个ByteString创建一个String时,它将使用一个编码(在本例中是UTF8)将字符串编码为字节。
不能从您包含的代码片段中说出问题所在,但是文档中有一个完整的示例客户机,它可能有助于将您的代码与:http://doc.akka.io/docs/akka/current/scala/io-tcp.html#Connecting进行比较。
https://stackoverflow.com/questions/43897928
复制相似问题