2012-02-19 6 views
0

J'essaye de configurer un serveur Websockets simple avec le jeu! cadre (1.2.4). Tout ce qui devrait arriver maintenant est que le client se connecte, reçoive un message "Hello User", puis le socket devrait se fermer. Je reçois des résultats différents avec différents navigateurs: Safari fonctionne comme prévu; Chrome 17 provoque une erreur:Jouez! Framework Websockets avec Chrome 17

play.exceptions.JavaExecutionException: The outbound channel is closed 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231) 
at play.mvc.WebSocketInvoker.invoke(WebSocketInvoker.java:28) 
at play.server.PlayHandler$WebSocketInvocation.execute(PlayHandler.java:1332) 
... 

Voici le code côté serveur:

package controllers; 

import play.*; 
import play.mvc.*; 
import play.mvc.Http.WebSocketClose; 
import play.mvc.Http.WebSocketEvent; 
import play.mvc.Http.WebSocketFrame; 

import java.util.*; 

import models.*; 
import play.data.validation.*; 


public class Application extends Controller { 

    public static void index() { 
     render(); 
    } 

    public static class WebSocket extends WebSocketController { 
     public static void hello(String name) { 
      outbound.send("Hello %s!", name); 
     } 
    } 
} 

/ws est dirigé vers Application.WebSocket.hello. Le javascript côté client:

window.onload = function() { 
    document.getElementById('sendbutton') 
     .addEventListener('click', sendMessage, false); 
    document.getElementById('connectbutton') 
     .addEventListener('click', connect, false); 
    document.getElementById('disconnectbutton') 
     .addEventListener('click', disconnect, false); 
} 

function writeStatus(message) { 
    var html = document.createElement("div"); 
    html.setAttribute('class', 'message'); 
    html.innerHTML = message; 
    document.getElementById("status").appendChild(html); 
} 

function connect() { 

ws = new WebSocket("ws://localhost:9000/ws?name=User"); 

    ws.onopen = function(evt) { 
     writeStatus("connected"); 
    } 

    ws.onclose = function(evt) { 
     writeStatus("disconnected"); 
    } 

    ws.onmessage = function(evt) { 
     writeStatus("response: " + evt.data); 
    } 

    ws.onerror = function(evt) { 
     writeStatus("error: " + evt.data); 
    } 
} 

function disconnect() { 
    ws.close(); 
} 

function sendMessage() { 
    ws.send(document.getElementById('messagefield').value); 
} 

est la réponse de poignée de main ne va pas? Comment puis-je réparer cela?

Répondre

2

Essayez d'obtenir la dernière version de la branche principale. 1.2.4 a été publié avant la publication de la dernière version du protocole websockets. En conséquence, cela a été une cible mouvante depuis, car les navigateurs ont ajouté les versions plus récentes, et les serveurs Web ont essayé de rattraper leur retard.

Cela devrait maintenant être stable car il est devenu un standard du W3C, et le support de Websocket est direct de Netty, plutôt que de jouer lui-même.

+0

Cela a fonctionné parfaitement. Je vous remercie! – user1219646

Questions connexes