Play рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ HTTP

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЖрдкрдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рддрд░рдл, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ: рд╣рдо рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рд╕рд░рд▓ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ рдФрд░ рдЙрд╕рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЖрдЧреЗ рдХрд╛рдо рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдФрд░ рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╣рдореЗрд╢рд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реЗ рджреВрд░ рд╣реИред рдпрд╣ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдкреНрд▓реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВред

рднрд╡рд┐рд╖реНрдп [рдкрд░рд┐рдгрд╛рдо]


рдкреНрд▓реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдорд╣рдВрдЧреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛ рднрд╡рд┐рд╖реНрдп [рдкрд░рд┐рдгрд╛рдо] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИ: рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВ, рдпрджрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдЙрд╕рдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрднреА рднреА рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рд╕реНрд╡рдпрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЦреИрд░, рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ [рдкрд░рд┐рдгрд╛рдо] рдЗрд╕реЗ рдлреЙрд░реНрдо рдХреА рдПрдХ рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИ:

import play.api.libs.concurrent.Execution.Implicits.defaultContext val futureInt: Future[Int] = scala.concurrent.Future { intensiveComputation()} 


рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Action.async рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 import play.api.libs.concurrent.Execution.Implicits.defaultContext def index = Action.async { val futureInt = scala.concurrent.Future { intensiveComputation() } futureInt.map(i => Ok("Got result: " + i))} 


рдФрд░ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рддрдм рддрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдб рдХреЛрдб рдХреЗ рдПрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддреА рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА рдФрд░ рдЙрд╕рдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рд╡рд╣ рдЕрдВрдд рдореЗрдВ рдЯреИрдм рдмрдВрдж рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рджреЗ (рдпрд╛рдиреА, рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдпрджрд┐ рдЗрд╕ рджреМрд░рд╛рди рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдпрд╣ рднреА рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 import play.api.libs.concurrent.Execution.Implicits.defaultContext import scala.concurrent.duration._ def index = Action.async { val futureInt = scala.concurrent.Future { intensiveComputation() } val timeoutFuture = play.api.libs.concurrent.Promise.timeout("Oops", 1.second) Future.firstCompletedOf(Seq(futureInt, timeoutFuture)).map { case i: Int => Ok("Got result: " + i) case t: String => InternalServerError(t) }} 


рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рднреА рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп [рдкрд░рд┐рдгрд╛рдо] рдХрд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЕрдВрдд рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрднреА рднреА рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдмрд╕ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рдПрдХ рдирд╣реАрдВред рдФрд░ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рдеред

HTTP рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ


HTTP 1.1 рдореЗрдВ, рдПрдХ рдПрдХрд▓ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( http://en.wikipedia.org/wiki/HTTP_persistent_connection )ред рдПрдХ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде: рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╣реЗрдбрд░ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдорддреМрд░ рдкрд░, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рднреЗрдЬрддреЗ рд╕рдордп, рдпрд╣ рд╕реНрдерд┐рддрд┐ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Play рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдХреНрд╖рдо рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ (рдЬрдм SimpleResult рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП) рдлреНрд░реЗрдорд╡рд░реНрдХ Enumerator (play.api.libs.iteratee.Enumerator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд░реАрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд▓рдВрдмрд╛рдИ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рд╛рдордЧреНрд░реАред рдФрд░ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдЗрд╕рд╕реЗ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдкреНрд▓реЗ рдХреЗ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ Iteratee рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред Iteratee-Enumerator рдмрдВрдбрд▓ рдЧреНрд░рд╛рд╣рдХ-рдирд┐рд░реНрдорд╛рддрд╛ рдкреИрдЯрд░реНрди рдХреЗ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, Iteratee рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рдЕрд╡рд╢реЛрд╖рд┐рдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░ рдПрдиреНрдпреБрдорд░реЗрдЯрд░, рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрди рдЕрдВрд╢реЛрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИред

рдиреЛрдЯ : рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдирдХ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд▓реЗ рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ: рдПрдиреБрдореЗрд░рд░реЗрдЯрд░.рдлреНрд░реЗрдордлрд╛рдЗрд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рддрд╛ рд╣реИ; Enumerator.fromStream - рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдПред рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╣реЗрдбрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдХреА рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрди рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 def index = Action { val file = new java.io.File("/tmp/fileToServe.mov") val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file) SimpleResult( header = ResponseHeader(200, Map(CONTENT_LENGTH -> file.length.toString)), body = fileContent )} 


рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкреНрд▓реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 def index = Action { Ok.sendFile(new java.io.File("/tmp/fileToServe.mov"))} 


рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдлрд╛рдпрджреЗ рднреА рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдпрд╛ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдпрд╛ рдЫрд╡рд┐ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬрд╛рдиреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЬрдм рддрдХ рдкреНрд░рд╕рд╛рд░рдг рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦрдВрдбрд┐рдд рдЙрддреНрддрд░ рдЪрдВрдХреНрдб рдЯреНрд░рд╛рдВрд╕рдлрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рддрдВрддреНрд░ ( http://en.wikipedia.org/wiki/Chunked_transfer_encoding ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрдирдХреА рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрднреА рддрдХ рдЙрдирдХреЗ рдЕрдВрддрд┐рдо рдЖрдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдкреНрд▓реЗ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЖрдк рдЕрднреА рднреА рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ:

 def index = Action { val data = getDataStream val dataContent: Enumerator[Array[Byte]] = Enumerator.fromStream(data) ChunkedResult( header = ResponseHeader(200), chunks = dataContent )} 


рд╡рд░рдирд╛:

 def index = Action { val data = getDataStream val dataContent: Enumerator[Array[Byte]] = Enumerator.fromStream(data) Ok.chunked(dataContent)} 


рдЖрдк рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 def index = Action { Ok.chunked( Enumerator("kiki", "foo", "bar").andThen(Enumerator.eof) )} 


.Then рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдПрдиреНрдпреБрдорд░реЗрдЯрд░ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Enumerator.eof рдХреЛ рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рдж рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╢реВрдиреНрдп рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдиреЛрдЯ : .Then рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк >>> рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрд╖реНрдардХ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЕрдкрдиреА рдХрдорд┐рдпрд╛рдВ рднреА рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЕрдВрддрд┐рдо рдХреНрд╖рдг рддрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рдЖрдХрд╛рд░ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рдпрд╣ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рд╢рдд рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдЛрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдкреАрдврд╝реА рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рдПред

рдзреВрдордХреЗрддреБ рд╕реЙрдХреЗрдЯ


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЦрдВрдбрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЙрдкрдпреЛрдЧ рдзреВрдордХреЗрддреБ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдпрджрд┐ рд╕рд░рд▓ рд╣реИ, рддреЛ рдпреЗ рдЙрддреНрддрд░ рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ
  .  ,      ,    -           ,     . 

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .
. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .
  .  ,      ,    -           ,     . 

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .
. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .

. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .

. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .
  .  ,      ,    -           ,     . 

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .
. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .

. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .

. , , - , .

, Ok.chunked Ok.stream:

def comet = Action { val events = Enumerator( """<script>console.log('kiki')</script>""", """<script>console.log('foo')</script>""", """<script>console.log('bar')</script>""" ) Ok.stream(events >>> Enumerator.eof).as(HTML)}


: Play framework:

def comet = Action { val events = Enumerator("kiki", "foo", "bar") Ok.stream((events &> Comet(callback = "console.log")) >>> Enumerator.eof)}


WebSockets
Play , Comet sockets . : , , , , Ajax-. , WebSockets ( http://en.wikipedia.org/wiki/WebSocket ), .

, WebSockets, Action: - . WebSocket, Action , , , , HTTP .

WebSocket :

def index = WebSocket.using[String] { request => // Just consume and ignore the input val in = Iteratee.consume[String]() // Send a single 'Hello!' message and close val out = Enumerator("Hello!").andThen(Enumerator.eof) (in, out)}

In - - Iteratee, , ; out - - Enumerator, .


, , , Play - , . : , .

Source: https://habr.com/ru/post/In219471/


All Articles