Как преобразовать Akka ByteString в String?
Прошу прощения, если это глупый вопрос, но я могу честно не разобраться в этом, не создавая своего рода код ASCII → map mapper сам, что я не думаю, что это правильный способ сделать это.
Итак, в настоящее время я делаю "приложение для чата" с Scala и Akka, где я использую отдельный объект клиента и сервера. Клиент подключается к серверу, отправляет сообщение, а сервер что-то делает с ним.
Я получил сообщение для отправки, но теперь я застрял на чтении сервера сообщений. Всякий раз, когда я получаю сообщение, я получаю ByteString, содержащую значения ASCII символов из сообщения. Как преобразовать этот ByteString в фактическую строку?
Соответствующий код (серверная сторона):
package chatapp.server
import java.net.InetSocketAddress
import akka.actor.{Actor, ActorSystem}
import akka.io.Tcp._
import akka.io.{IO, Tcp}
/**
* Created by Niels Bokmans on 30-3-2016.
*/
class ServerActor(actorSystem: ActorSystem) extends Actor {
val Port = 18573
val Server = "localhost"
IO(Tcp)(actorSystem) ! Bind(self, new InetSocketAddress("localhost", Port))
def receive: Receive = {
case CommandFailed(_: Bind) =>
println("Failed to start listening on " + Server + ":" + Port)
context stop self
actorSystem.terminate()
case Bound(localAddress: InetSocketAddress) =>
println("Started listening on " + localAddress)
case Connected(remote, local) =>
println("New connection!")
sender ! Register(self)
case Received(data) =>
println(data)
}
}
Изображение сервера (так как вы можете видеть, что он принимает соединения → получает новое соединение → получает сообщение от соединения):
![Серверная сторона]()
Изображение клиента (подключается к серверу и затем отправляет сообщение "testmessage" )
![Клиентская сторона]()
Ответы
Ответ 1
Используйте
scala> val data = ByteString("xyz")
data: akka.util.ByteString = ByteString(120, 121, 122)
scala> data.utf8String
res3: String = xyz
см. ByteString API,
или на github:
final def utf8String: String = decodeString (ByteString.UTF_8)
Ответ 2
Вы можете использовать метод decodeString
следующим образом:
scala> val x = ByteString("abcd")
x: akka.util.ByteString = ByteString(97, 98, 99, 100)
scala> x.decodeString("US-ASCII")
res0: String = abcd