web-dev-qa-db-fra.com

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): Server side

Image du client (se connecte au serveur puis envoie un message "testmessage") Client side

28
nbokmans

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)

49
Andrzej Jozwik

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
21
rgcase