2012-02-19 20 views
0

私はPlay!で簡単なWebsocketsサーバーを設定しようとしています。フレームワーク(1.2.4)。クライアントが接続し、 "Hello User"メッセージを受け取ったら、ソケットを閉じる必要があります。ブラウザごとに異なる結果が出ています。Safariは期待通りに動作します。クローム17は、エラーが発生します。再生!フレームワークのWebSocket with Chrome 17

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 Application.WebSocket.helloにルーティングされます。ここでは

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) 
... 

は、サーバー側のコードがあります。 クライアント側のjavascript:

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); 
} 

は、ハンドシェイク応答が間違っていますか?これをどうすれば解決できますか?

答えて

2

masterブランチから最新バージョンを取得してください。 1.2.4はwebsocketsプロトコルの最新バージョンがリリースされる前にリリースされました。結果として、ブラウザは新しいバージョンを追加し、Webサーバーは追いつこうとしているので、これは常に目標の移動です。

これはW3Cの標準となっており、WebsocketのサポートはPlay自体ではなくNettyからの直接的なものであるため、安定しているはずです。

+0

これは完全に機能しました。ありがとうございました! – user1219646

関連する問題