-
Notifications
You must be signed in to change notification settings - Fork 26
关于bilibili 2020 4 10下午16点左右开始的弹幕升级说明
for { if conn == nil { return } if !Array.InArrayInt(real_room, RoomList) { return } _, msg, err := conn.ReadMessage() if err != nil { //log.Println("直播间读取错误goroutine停止:", real_room, err) return } if len(msg) > 16 { megLEn := MessageSelect(msg, len(msg)) if len(megLEn) > 2 { > megLEn = Calc.ZlibDec(megLEn) if len(megLEn) > 2 { check := bytes.SplitAfter(megLEn, []byte{0, 0, 0, 5, 0, 0, 0, 0}) count := len(check) for i, v := range check { json_content := v if i != count-1 { cl := len(v) - 16 json_content = v[:cl] } if len(string(json_content)) > 2 { MessageType(json_content, real_room) } } } } } }
这个是C2C弹幕模块的代码, 请注意注释的部分,其实就是在接收弹幕的时候使用了zlib解压缩
不得不说B站的这个设计非常的聪明,可以在弹幕层面上节省很大的流量,如果采用高压缩率,理论上长弹幕,尤其是现在新版的礼物弹幕、全站弹幕方面,将会匀出更多的服务器带宽,可谓是立竿见影的优化
从部署角度分析,为了这次的弹幕优化不会殃及池鱼
func JoinRoom(real_room int, conn *websocket.Conn) { rand.Seed(Calc.Seed() + Calc.Any2Int64(real_room)) random := rand.Float64() uid := int(random*200000000000000.0 + 100000000000000.0) makeMap := make(map[string]int) makeMap["uid"] = uid makeMap["protover"] = 2 makeMap["roomid"] = real_room jsonBody, _ := jsoniter.Marshal(makeMap) body := string(jsonBody) handshake := fmt.Sprintf("%08x001000010000000700000001", len(body)+16) fmt.Println("进入:", real_room) buf := make([]byte, len(handshake)>>1) hex.Decode(buf, []byte(handshake)) if conn == nil { return } //conn.WriteMessage(websocket.BinaryMessage, append(buf, []byte(body)…)) var ws WS ws.Conn = conn ws.Roomid = real_room ws.Buf = append(buf, []byte(body)…) ws.Errstring = "" ChanWS ← ws }
在加入的时候使用了protover为2的参数用于区隔老版本和新版本,今天v1全部失效,说明v2和v1一定共存了一段时间,虽然这次升级不是无缝的,但是的却是一个全端无缝升级的经典操作,bilihp在未来的升级中也会采用兼容的形式,比如大家昨天更新的“极验验证”版本的APP
在接下来我们将对接新版接口,保证软件能以高时效的状态运行,也请继续支持bilihp
如果需要读取相关的接口信息,请直接查看bilihp-api-document