문제

나는 확실하지 않다면 내가 발생한 기본 시간 제한(설정할 수 있습니이 어딘가?), 그러나 어쩌면 나는 뭔가를 누락.클라이언트가 브라우저 설정 websocket 연결을 유지,지속성을 알려준다.그런 다음에서 분리,아이디 삭제는 지속 개체입니다.간단하다.Disconnect 일반적으로 가 트리거되는 경우 클라이언트가 브라우저를 닫지만, 지 않은 경우 클라이언트가 꺼 wi-fi (테스트에 MacBook Pro,하지 않는 것이 이 문제해야).

에 밀라노 컨트롤러 나는 모든 로깅 in 메시지 아무것도 제공해 wi-fi 가 꺼져 있(서 문서, 데,기대 EOF?).

나는 생각한 것이어야 합동 버스에서 가져온 나는 어떻게 해석 WS 프로토콜 서버 닫 WebSocket 연결, 고 로그인해야 문제입니다. 하지만 후기 일어나지 않는다.

val in = Iteratee.foreach[String](x => {
  logger.info("Websocket msg: " + x)
   // expect EOF?
   x match {
     case "persist" => // persist some object
   }
}).mapDone { x =>
   // delete my persisted object (never happens unless browser/tab closed)
}

누군가는 이것을 경험했는가?난 둘 다 시도했는 간단하고 컨트롤러가 일치하는 내 구성이 있습니다.도 ws3ws2 컨트롤러에는 아래다.재생!아래 코드:

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(""))
  }
}

View 는 간단하다:

@(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
도움이 되었습니까?

해결책

이지 플레이의 특정 오히려 네트워크 관련 문제입니다.무슨 일어나는 연결을 해제하는 경우,일반적으로 다른 최종 보 FIN 패킷 및 서버에 대해 알고있는 그것을 걸려.는 경우 다른 쪽 끝이 없 네트워크 연결,그것은 그렇게 할 수 없습니다.

는 방법을 결정하는 경우 소켓을 열어 다음?을 얻은 것은 예외하려고 할 때 읽거나 쓸 수 있습니다.그러나 차단하지 않는 모델의하지 않는 그 자체에 의해 발생합니다.그래서 귀하의 경우에는 것:

  • 시간 제한
  • 게 JavaScript 보내 핑 이내에 시간 제한 기간
  • 지 않은 경우 핑 도착하면 연결이 끊

보내거나 핑에서 server side(쓸 socket).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top