2012-10-01 3 views
11

기본 시간 초과가 발생하는지 잘 모르겠지만 (어딘가에 설정할 수 있습니까?), 아마도 누락되었습니다. 클라이언트의 브라우저가 websocket 연결을 설정하면 나는 지속성을 유지합니다. 그런 다음 연결이 끊어지면 해당 영구 객체를 삭제합니다. 충분히 간단합니다. 클라이언트가 브라우저를 닫을 때 은 일반적으로으로 시작되지만 클라이언트가 Wi-Fi 연결을 해제 할 때 이 아닌 경우 (MacBook Pro에서 테스트 할 때 문제가되는 것은 아닙니다). 스칼라 컨트롤러에서 Websocket '하드'연결이 명확하지 않습니까?

, 나는 모든 in 메시지를 기록하고 있지만, 아무것도는 Wi-Fi를 끄면을 통해 온다합니다 ( docs에서, 내가 EOF를 기대?).

나는 서버가 웹 소켓 연결을 닫아야합니다, 문제를 기록해야 내가 WS protocol를 해석하는 방법에서 가져온로이 버그해야한다고 생각합니다.하지만 후자는 발생하지 않습니다.

누구에게이 경험이 있습니까? 나는 간단한 컨트롤러와 내 구성과 일치하는 것을 시도했다. 아래의 ws3 또는 ws2 컨트롤러가 아닙니다. 놀이! 아래 코드 :

object Application extends Controller { 

    private def ws(out: PushEnumerator[String]) = { 

    Logger.logger.info("ws()") 

    val in = Iteratee.foreach[String](x => { 
     Logger.logger.info("Websocket msg: " + x) 
     try { 
     x match { 
      case "persist" => Logger.logger.info("PERSIST") 
     } 
     } catch { 
     case e: Exception => { 
      Logger.logger.info("NOT RECOGNIZED COMMAND, NO PERSIST") 
     } 
     } 
    }).mapDone { x => 
     Logger.logger.info("STOP PERSIST") 
    } 
    in 
    } 

    def ws2() = WebSocket.using[String] { request => 

    Logger.logger.info("ws2()") 

    val out = Enumerator.imperative[String]() 
    val in = ws(out) 

    (in, out) 
    } 

    def ws3() = WebSocket.using[String] { request => 

    Logger.logger.info("ws3()") 

    val out = Enumerator.imperative[String]() 
    val in = Iteratee.foreach[String](x => { 
     Logger.logger.info("Websocket msg: " + x) 
     try { 
     x match { 
      case "persist" => Logger.logger.info("PERSIST") 
     } 
     } catch { 
     case e: Exception => { 
      Logger.logger.info("NOT RECOGNIZED COMMAND, NO PERSIST") 
     } 
     } 
    }).mapDone { x => 
     Logger.logger.info("STOP PERSIST") 
    } 
    (in, out) 
    } 

    def view() = Action { implicit request => 
    Ok(views.html.index.render("")) 
    } 
} 

보기는 간단하다 :

@(message: String) @main("Welcome to Play 2.0") { 

@play20.welcome(message) } 

<script type="text/javascript" charset="utf-8"> 
    var sock = new WebSocket("ws://192.168.1.120:9001/ws3"); 

    sock.onopen = function(event) { 
     sock.send('persist'); 
    } 
</script> 

경로 :

GET  /ws2       controllers.Application.ws2 
GET  /ws3       controllers.Application.ws3 
GET  /view       controllers.Application.view 

답변

2

이 프레임 워크 특정 아니라 네트워크 관련 문제를 재생하지 않습니다. 무슨 일이 일어나는가하면 정상적으로 연결을 끊으면 다른 쪽이 FIN 패킷을 보내고 서버는 끊어지는 것을 안다는 것입니다. 다른 쪽 끝이 네트워크에 연결되어 있지 않으면 그렇게 할 수 없습니다.

소켓이 열려 있는지 확인하는 방법은 무엇입니까? 읽거나 쓰려고 할 때 예외가 생깁니다. 그러나 nonblocking model은 그 자체로는 일어나지 않습니다. 따라서 귀하의 경우에는 내가 것이다 :

  • 가 타임 아웃을 가지고
  • 더 핑이,

을 분리하거나 서버 측에서 ping을 보내 도착하면 자바 스크립트 타임 아웃 기간

  • 내에서 ping을 보내 확인 (쓰기 소켓에 연결).

  • +0

    경영이 내가 두려워했던 것이 었습니다. https://code.google.com/p/chromium/issues/detail?id=76358 -에도이 URL이 있습니다. 이것은 프레임 워크에 내장 된 것이거나 적어도 말한 것이어야합니다. 감사! –

    +0

    "socket.io"서버 메모리 크리프도이 범주에 속합니다. –