1

我正在使用 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

我希望这是一些我忽略的简单修复。

4

1 回答 1

0

在网络上没有Stringor之类的东西ByteString,只有字节。ByteString本质上只是一个围绕字节数组的包装器,以确保它们不会发生变异(因为这需要同步才能安全地在线程/参与者之间共享)。当您ByteString从 a创建 a 时String,它将使用编码(UTF8在这种情况下)将字符串编码为字节。

无法从您包含的代码中说出什么问题,但文档中有一个完整的示例客户端可能有助于将您的代码与以下内容进行比较:http: //doc.akka.io/docs/akka /current/scala/io-tcp.html#Connecting

于 2017-05-12T14:03:25.003 回答