2016-02-03 1 views
0

J'ai un contrôleur de scala dans lequel j'appelle un service web externe en utilisant WS api de Play! cadre qui renvoie un json. La même API doit maintenant être appelée à l'aide d'un WebSocketClient, car toute connexion doit être effectuée à l'aide d'un WebSocket au lieu de http. Donc Action normal dans le contrôleur sont convertis en WebSocket fonctions, mais je ne suis pas en mesure d'appeler une fonction WebSocket à partir du code scala. J'ai cherché et ai traversé plusieurs endroits sur le Web pour la solution, mais je n'ai pas trouvé la solution n'importe où. Comment cela peut-il être fait, en appelant une fonction WebSocket et récupérer son json en utilisant un WebSocketClient dans le code scala OU nous pouvons dire, en consommant un WebSocket à partir du code scala? J'ai trouvé une question similaire à la mienne sur SO mais aucune n'a donné de réponse à ça! Je veux savoir si c'est possible ou pas dans le cadre de jeu?Implémentation d'un WebSocketClient dans le contrôleur Scala

Consume a WebSocket connection using Scala and Play

Edit: Je suis le code suivant la mise en œuvre:

val c = new AsyncHttpClient() 
val webSocketClient = c.prepareGet("ws://0.0.0.0:9000/testSocket").execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(new WebSocketTextListener { 

    override def onMessage(s: String): Unit = { 
    } 

    override def onOpen(webSocket: websocket.WebSocket): Unit = { 
    webSocket.sendTextMessage("test") 
    } 

    override def onFragment(s: String, b: Boolean): Unit = {} 

    override def onError(throwable: Throwable): Unit = {} 

    override def onClose(webSocket: websocket.WebSocket): Unit = { 
    latch.countDown() 
    } 
}).build()).get() 

val result = webSocketClient.sendTextMessage("true") 
println("================================" + result) 

La variable result n'est pas imprimé sur la console donnant une exception de l'analyseur de JSON.

Mise à jour: Ma connexion WebSocket à ws://0.0.0.0:9000/testSocket qui est à l'intérieur d'un contrôleur de scala de projet différent, est aussi sous:

def sockeTest = WebSocket.tryAccept[JsValue] { request => 
    futureJsonVariable.map { json => 
    val in = Iteratee.ignore[JsValue] 
    // Some database computation here which generated a Future[JsValue] value in futureJsonVariable variable. 
    val out = Enumerator(json).andThen(Enumerator.eof) 
    Right((in, out)) 
    } recover { 
    case err => Left(InternalServerError(err.getMessage)) 
    } 
} 

Update2: Une dernière chose que je voudrais demander au sujet de ce que, nous invoquons une WebSocket connexion en utilisant webSocket.sendMessage("test".getBytes()) qui nous donne la réponse de WebSocket dans la méthode substituée onMessage(). Je veux savoir, comment pouvons-nous attendre jusqu'à ce qu'une réponse WebSocket est reçue, de sorte que nous puissions effectuer les calculs requis avec les données de réponse WebSocket. J'ai vérifié en retournant une variable Future[JsValue] à l'intérieur de la méthode onMessage() mais cette chose est quelque chose d'invalide. Alors, comment pouvons-nous mettre webSocket.sendMessage("test".getBytes()) en mode attente, de sorte que le code supplémentaire est exécuté sur la réponse de WebSocket?

Répondre

1

La lecture ne prend pas en charge les connexions client WebSocket. La meilleure option est probablement d'utiliser AsyncHttpClient, c'est la bibliothèque que l'API de jeu WS est construit sur il sera déjà sur votre chemin de classe, des instructions pour accéder WebSockets l'utiliser sont ici:

https://github.com/AsyncHttpClient/async-http-client

+0

Merci pour votre réponse , Je suis passé par le lien github fourni par vous et je peux voir que l'implémentation du code est en Java. J'essaierai d'implémenter le même code dans scala que je travaille avec le contrôleur de scala. Avez-vous des références de liens dans votre base de connaissances où cette même implémentation est fournie dans scala? –

+0

Je vous suggère d'apprendre Scala mieux. Le code Java peut être trivialement converti en code Scala. –

+0

J'ai essayé d'implémenter le code scala à partir du code java fourni sur votre dit lien github. Je veux savoir comment, comment puis-je récupérer la sortie json quand un WebSocket est connecté à partir de scala (Un WebSocket est connecté lorsque nous effectuons 'webSocketVar.sendTextMessage (" test ")'? Je veux savoir ce que je devrais écrire dans le overridden méthode 'onMessage()' afin d'obtenir la réponse json de la méthode WebSocket que je connecte? J'ai mis à jour dans ma question pour le code que j'applique –