在 Grails 控制器中,您需要更改为如下所示:
package sessionManager
class SSETestController {
def push = {
println "$request made it!"
response.setContentType("text/event-stream, charset=UTF-8")
//response << "data: the data\n\n"
render "data: the data\n\n"
}
}
在其基本形式中,响应应包含“data:”行,后跟您的消息,然后是两个“\n”字符以结束流:
data: My message\n\n
现在控制台中的响应是:
Starting eventSource
Started eventSource
eventState: 0
Open [object Event]
Message received: the data
Error [object Event]
Open [object Event]
Message received: the data
Error [object Event]
Open [object Event]
Message received: the data
Error [object Event]
Open [object Event]
Message received: the data
Error [object Event]
更详细的你可以看看http://www.html5rocks.com/en/tutorials/eventsource/basics/ http://www.html5rocks.com/en/tutorials/eventsource/basics/.
UPDATE
但为什么每次都会抛出错误呢?
错误可能有不同的原因,例如:网络超时。在我们的例子中,这是由于服务器和浏览器之间的连接关闭所致。
为什么它不断地 ping 服务器?
浏览器获取后关闭服务器与浏览器的连接the data
。因此,浏览器会在每次连接关闭后大约 3 秒尝试重新连接。
我认为 HTML5 应该在 JavaScript 运行时连接一次
第一次,只要控制器发送就接收事件
他们。
它应该始终与服务器连接,但不会连接一次。
是的,只要控制器向事件发送消息,它就会接收事件。但在我们的例子中,服务器/控制器只是发送data: the data\n\n
并且连接已关闭。
为了连续接收消息,您需要在控制器操作中有循环。例如 :
package sessionManager
class SSETestController {
def push = {
println "$request made it!"
response.setContentType("text/event-stream, charset=UTF-8")
for(int i = 0 ; i < 10 ; i++){
render "data: the data\n\n"
Thread.sleep(1000)
}
render "data: finished\n\n"
}
}
您还可以使用while(true)
loop.
如果您想了解更多onerror
,你可以看到这个链接http://www.htmlgoodies.com/beyond/reference/receive-updates-from-the-server-using-the-eventsource.html http://www.htmlgoodies.com/beyond/reference/receive-updates-from-the-server-using-the-eventsource.html.
根据上面的链接,
有一个 onerror() 事件处理程序,但它没有你那么有用
可能会想。然而它可以告诉我们一些关于什么是
这要归功于 EventSource 的 readState 属性。为了
例如,EventSource.CONNECTING 的值表示连接
丢失并且 EventSource 正在尝试重新连接。如果有什么
如果出现非常错误的情况,EventSource.CLOSED 的值会让您知道。
除此之外,您无法获得太多信息,因为没有错误
查询对象。相反,传递的是事件对象本身
给处理程序。 EventSource 可以通过 eventSource 或
eventTarget 属性,因为两者都指向同一个对象。