From 7d15fb93b27a240408b632d490b131fcd2b546f9 Mon Sep 17 00:00:00 2001 From: czp Date: Wed, 31 Jan 2018 11:20:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E4=B8=8E=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 67 +++++++++++++++++-- build.gradle | 2 +- .../bilibili/api/live/socket/LiveClient.java | 13 ++++ 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index aad6602..f4283b4 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,14 @@ # 添加依赖 ## Gradle - compile group: 'com.hiczp', name: 'bilibili-api', version: '0.0.1' + compile group: 'com.hiczp', name: 'bilibili-api', version: '0.0.2' ## Maven com.hiczp bilibili-api - 0.0.1 + 0.0.2 # 名词解释 @@ -83,7 +83,7 @@ LoginException 在 accessToken 错误或过期时抛出 打印一个直播间的历史弹幕 int roomId = 3; - new BilibiliRESTAPI() + new BilibiliAPI() .getLiveService() .getHistoryBulletScreens(roomId) .execute() @@ -105,7 +105,66 @@ API 文档 ## Socket ### 获取直播间实时弹幕 -//TODO 尚未实现 + + int roomId = 3; + LiveClient liveClient = new BilibiliAPI() + .getLiveClient(roomId) + .registerListener(new MyListener()) + .connect(); + +.connect() 会抛出 IOException 当网络故障时. + +(connect 以及 close 方法都是阻塞的) + +(connect 方法运行结束只代表 socket 确实是连上了, 但是服务器还没有响应进房请求数据包) + +(当服务器响应进房请求数据包时才代表真的连上了, 此时会有一个连接成功的事件, 见下文) + +事件机制使用 Google Guava EventBus 实现, 监听器不需要继承任何类或者接口. + + public class MyListener { + @Subscribe + public void onConnectSucceed(ConnectSucceedEvent connectSucceedEvent) { + //do something + } + + @Subscribe + public void onConnectionClose(ConnectionCloseEvent connectionCloseEvent) { + //do something + } + + @Subscribe + public void onDanMuMsg(DanMuMsgPackageEvent danMuMsgPackageEvent) { + DanMuMsgEntity danMuMsgEntity = danMuMsgPackageEvent.getDanMuMsgEntity(); + System.out.pintf("%s: %s\n", danMuMsgEntity.getUsername(), danMuMsgEntity.getMessage()); + } + } + +如果持续 40 秒(心跳包为 30 秒)没有收到任何消息, 将视为掉线, 会跟服务器主动断开连接一样(这通常是发送了服务器无法读取的数据包)触发一次 ConnectionCloseEvent. + + liveClient.close(); + +即可关闭连接. + +所有的事件(有些数据包我也不知道它里面的一些值是什么含义, /record 目录下面有抓取到的 Json, 可以用来查看): + +| 事件 | 抛出条件 | +| :--- | :--- | +| ActivityEventPackageEvent | 收到 ACTIVITY_EVENT 数据包 | +| ConnectionCloseEvent | 连接断开(主动或被动) | +| ConnectSucceedEvent | 进房成功 | +| DanMuMsgPackageEvent | 收到 DANMU_MSG 数据包 | +| LivePackageEvent | 收到 LIVE 数据包 | +| PreparingPackageEvent | 收到 PREPARING 数据包 | +| SendGiftPackageEvent | 收到 SEND_GIFT 数据包 | +| SysGiftPackageEvent | 收到 SYS_GIFT 数据包 | +| SysMsgPackageEvent | 收到 SYS_MSG 数据包 | +| UnknownPackageEvent | B站新增了新种类的数据包, 出现此情况请提交 issue | +| ViewerCountPackageEvent | 收到 房间人数 数据包(不是 Json) | +| WelcomeGuardPackageEvent | 收到 WELCOME_GUARD 数据包 | +| WelcomePackageEvent | 收到 WELCOME 数据包 | + +事件里面可以取到解析好的 POJO, 然后可以从里面取数据, 见上面的监听器示例. # 特别说明 ## 直播间 ID 问题 diff --git a/build.gradle b/build.gradle index 27b02fb..871fb7e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ group = 'com.hiczp' -version = '0.0.1' +version = '0.0.2' description = 'Bilibili android client API library written in Java' apply plugin: 'idea' diff --git a/src/main/java/com/hiczp/bilibili/api/live/socket/LiveClient.java b/src/main/java/com/hiczp/bilibili/api/live/socket/LiveClient.java index 4e55ffd..61f40ea 100644 --- a/src/main/java/com/hiczp/bilibili/api/live/socket/LiveClient.java +++ b/src/main/java/com/hiczp/bilibili/api/live/socket/LiveClient.java @@ -1,10 +1,12 @@ package com.hiczp.bilibili.api.live.socket; import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; import com.hiczp.bilibili.api.BilibiliServiceProvider; import com.hiczp.bilibili.api.live.entity.LiveRoomInfoEntity; import com.hiczp.bilibili.api.live.socket.codec.PackageDecoder; import com.hiczp.bilibili.api.live.socket.codec.PackageEncoder; +import com.hiczp.bilibili.api.live.socket.event.ConnectionCloseEvent; import com.hiczp.bilibili.api.live.socket.handler.LiveClientHandler; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; @@ -39,12 +41,18 @@ public class LiveClient implements Closeable { this.bilibiliServiceProvider = bilibiliServiceProvider; this.showRoomId = showRoomId; this.userId = 0; + initEventBus(); } public LiveClient(BilibiliServiceProvider bilibiliServiceProvider, long showRoomId, long userId) { this.bilibiliServiceProvider = bilibiliServiceProvider; this.showRoomId = showRoomId; this.userId = userId; + initEventBus(); + } + + private void initEventBus() { + eventBus.register(this); } public synchronized LiveClient connect() throws IOException { @@ -121,6 +129,11 @@ public class LiveClient implements Closeable { } } + @Subscribe + public void onConnectionClose(ConnectionCloseEvent connectionCloseEvent) { + eventLoopGroup.shutdownGracefully(); + } + public EventBus getEventBus() { return eventBus; }