运行github.com\beego\samples目录下的WebIM应用,配置目录下的app.conf文件中包含"lang_types = zh-CN|en-US",而且也包含locale_en-US.ini、locale_zh-CN.ini两个文件。在chrome浏览器去访问的时候总是显示中文,在controllers目录下的baseController结构体的Prepare方法中看到注释"Prepare implemented Prepare() method for baseController.It's used for language option check and setting.",调用this.Ctx.Request.Header.Get("Accept-Language")获取到accept language,然后再设置的中文,但是在beego库和WebIM应用中都没有搜到"Accept-Language",然后就把this.Ctx.Request.Header打印出来得到"map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9] Cache-Control:[max-age=0] Connection:[keep-alive] Sec-Fetch-Mode:[navigate] Sec-Fetch-Site:[cross-site] Sec-Fetch-User:[?1] Upgrade-Insecure-Requests:1 User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36]]"。看来是chrome自带的"Accept-Language"字段。
WebIM应用中routers目录下的router.go文件的init函数中定义了路由规则,初始化为welcome.html即欢迎界面,在该网页文本中处于form表单中的submit类型的button,由于form的action属性值为"/join"而且method属性值为"post",所以会直接调用AppController类的Join方法,最终会重定向到长轮询或者websocket的主页,其实longpolling.html和websocket.html几乎没有区别。
因为在长轮询对应的js文件longpolling.js中"Call fetch every 3 seconds",所以在路由"/lp/fetch"对应的处理函数LongPollingController类的Fetch函数中需要通过chan bool来阻塞,只有chatroom.go中有新的models.Event来到后,才会继续执行长轮询的Fetch函数,然后把数据返回到网页端的longpolling.js中,js去做聊天事件的呈现,而且js中根据isWait变量来判断如果正在阻塞等待服务端数据后就不会继续fetch。
websocket.go文件中定义了区别长轮询的另一种连接,websocket连接。1、在对应的websocket.js文件中"// Create a socket"连接的是"'ws://' + window.location.host + '/ws/join?uname='",根据路由配置最终会调用WebSocketController类的Join方法;2、注意WebSocketController类的Join方法中依赖"github.com/gorilla/websocket"所创建的websocket对象,其中注释"// Upgrade from http request to WebSocket.";WebSocketController类的Join方法中的ws就代表了网页客户端到服务的的连接;3、服务端的Join方法中"// Message receive loop"不断的从网页端阻塞读取数据,而网页端的websocket.js文件中在用户点击"发送"按钮后调用"socket.send(content);"发送数据到服务端;4、当服务端有event事件时候调用broadcastWebSocket广播函数依次往所有的websocket连接中发送数据;5、websocket是长连接,所以断开的时候会通知到其他的连接(包括长轮询的短连接)事件"xxx left the chat room"。