Comment convertir Akka ByteString en chaîne?
Je suis désolé si c'est une question stupide mais je ne peux honnêtement pas le comprendre sans avoir mis en place une sorte de ASCII code -> mappeur de caractères moi-même, ce qui, je pense, n'est pas le bon) façon de le faire.
Donc actuellement je fais une "application de chat" avec Scala et Akka où j'utilise un client et une entité serveur séparés. Le client se connecte au serveur, envoie un message et le serveur fait quelque chose avec il.
J'ai réussi à envoyer un message, mais maintenant je suis bloqué sur la lecture du message côté serveur. Chaque fois que je reçois un message, j'obtiens une chaîne ByteString contenant les valeurs ASCII des caractères du message. Comment convertir cette chaîne ByteString en une chaîne réelle?
Code pertinent (côté serveur):
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)
}
}
Image du serveur (comme vous pouvez le voir, il accepte les connexions -> reçoit une nouvelle connexion -> reçoit un message de la connexion):
Image du client (se connecte au serveur puis envoie un message "testmessage")
Utilisation
scala> val data = ByteString("xyz")
data: akka.util.ByteString = ByteString(120, 121, 122)
scala> data.utf8String
res3: String = xyz
voir ByteString API ,
ou sur github:
final def utf8String: String = decodeString (StandardCharsets.UTF_8)
Vous pouvez utiliser la méthode decodeString
comme ceci:
scala> val x = ByteString("abcd")
x: akka.util.ByteString = ByteString(97, 98, 99, 100)
scala> x.decodeString("US-ASCII")
res0: String = abcd