0

Play Framework 버전 2.1에서 작동하도록 websocket 통신을 사용할 수없는 것으로 보입니다.Chrome의 Play Framework 2.1 웹 소켓

버튼을 눌러 메시지를주고받는 간단한 테스트를 만들었습니다. 그것을위한 모든 코드는 아래 있습니다. 그러나 버튼을 제외하고는 아무 것도 나타나지 않습니다.

이 문제를 본 사람이 있습니까? 아니면 누군가 내가 아래 코드에서 잘못되었을 수 있습니다.

최신 버전의 Chrome을 사용하고 있습니다.

여기 내 간단한 설정입니다. Application.java에서

경로에서

public static Result index() { 
    return ok(index.render()); 
} 

public static WebSocket<String> sockHandler() { 
    return new WebSocket<String>() { 
     // called when the websocket is established 
     public void onReady(WebSocket.In<String> in, 
       WebSocket.Out<String> out) { 
      // register a callback for processing instream events 
      in.onMessage(new Callback<String>() { 
       public void invoke(String event) { 
        System.out.println(event); 
       } 
      }); 

      // write out a greeting 
      out.write("I'm contacting you regarding your recent websocket."); 
     } 
    }; 
} 

Index.Scala.html에서 GET/controllers.Application.index()

# Map static resources from the /public folder to the /assets URL path 
GET  /assets/*file    controllers.Assets.at(path="/public", file) 
GET  /greeter     controllers.Application.sockHandler() 

파일

@main(null) { <div class="greeting"></div> <button class="send">Send</button> <script type="text/javascript" charset="utf-8"> $(function() { var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket var sock = new WS("@routes.Application.sockHandler()") sock.onmessage = function(event) { $('.greeting').append(event.data) } $('button.send').click(function() { sock.send("I'm sending a message now.") }); }) </script> 
당신이 프로토콜과의 완전한 URL을 지정해야
var sock = new WS("@routes.Application.sockHandler()") 

} Main.scala.html에서

@(title: String)(content: Html) 
<!DOCTYPE html> 
<html> 
<head> 
    <title>@title</title> 
    <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")"> 
    <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")"> 
    <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script> 
</head> 
<body> 
    @content 
</body> 

답변

3

당신은 웹 소켓의 생성자에 건네 줄 수있는 URL을 검색 할 경로의 webSocketURL() 방법을 사용할 수 있습니다. 내가 생각하기 때문에

$(function() {    
    var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket 
    var chatSocket = new WS("@routes.Application.chat(username).webSocketURL()") 

    var sendMessage = function() { 
    chatSocket.send(JSON.stringify(
     {text: $("#talk").val()} 
    )) 
    $("#talk").val('') 
    } 

    // ... 

그래서 코드에서 당신이, 내가 JS와 보간 코드를 섞여서 좋아하지 않아 개인적으로

var sock = new WS("@routes.Application.sockHandler().webSocketURL()"); 

같은 것을 사용할 수 있습니다 : 여기 Play의 웹 소켓 채팅 샘플 코드의 예입니다 클라이언트에서 실행되는 모든 코드는 서버가 아닌 클라이언트의 상태에만 관심을 가져야합니다 (스크립트를 외부 파일로 리팩토링하는 것은 불가능 함). 따라서 다음과 같은 경향이 있습니다.

<div class="container app-container" 
    data-ws-uri="@routes.Application.WSUri.webSocketURL()"> 
....... 
</div> 

내 JS에서 나는 단지 다음과 같이 할 수있다.

var sock = new WS(document.querySelector(".app-container").dataset.wsUri); 
// .... 
+0

어떤 이유로 인해 webSocketURL()이 Play 2.1에서 작동하지 않습니다.내가이 메시지를 넣으면 요청 헤더를 찾을 수 없다는 오류 메시지가 나타납니다. play 2.1 ... – user2196112

+0

에서 이러한 URL을 처리하는 더 좋은 방법이 있어야합니다. 템플릿 상단에서'@ (암시 적 요청 : RequestHeader) '를 원할 것입니다. 당신을 위해 일합니다. 불행히도 이것을 문서화에 약간의 느슨한 플레이입니다 ... 편집 : 실제로 당신이 명시 적으로 요청을 전달해야한다고 생각합니다. 그것은 내 코드에서 무엇을하고 작동합니다. –

+0

흠 ... 나는 이렇게 시도했다 : 'var sock = new WS ("@ routes.Application.sockHandler(). webSocketURL (request)");' 하지만 그것은 나에게 발견하지 못한 오류를 주었다 : value request – user2196112

관련 문제