private void ProcessDanmaku(int action, byte[] buffer) { switch (action) { case 3: { var viewer = EndianBitConverter.BigEndian.ToUInt32(buffer, 0); ReceivedUserCount?.Invoke(this, new SocketReceivedUserCountArgs() { RoomID = RoomID, UserCount = viewer }); break; } case 5: { var json = Encoding.UTF8.GetString(buffer, 0, buffer.Length); if (IsDebug) { LogMessage?.Invoke(this, new SocketLogMessageArgs { RoomID = RoomID, Message = json }); } try { var dama = new BilibiliLiveDanmaku_SocketReceiveData(json, 2); ReceivedDanmaku?.Invoke(this, new SocketReceivedDanmakuArgs() { RoomID = RoomID, Danmaku = dama }); } catch { } break; } case 8: { break; } default: { break; } } }
private void ReceiveMessageLoop() { try { var stableBuffer = new byte[Client.ReceiveBufferSize]; while (IsConnected) { NetStream.ReadB(stableBuffer, 0, 4); var packetlength = BitConverter.ToInt32(stableBuffer, 0); packetlength = IPAddress.NetworkToHostOrder(packetlength); if (packetlength < 16) { throw new NotSupportedException("协议失败: (L:" + packetlength + ")"); } NetStream.ReadB(stableBuffer, 0, 2); NetStream.ReadB(stableBuffer, 0, 2); NetStream.ReadB(stableBuffer, 0, 4); var typeId = BitConverter.ToInt32(stableBuffer, 0); typeId = IPAddress.NetworkToHostOrder(typeId); Console.WriteLine(typeId); NetStream.ReadB(stableBuffer, 0, 4); var playloadlength = packetlength - 16; if (playloadlength == 0) { continue; } typeId = typeId - 1; var buffer = new byte[playloadlength]; NetStream.ReadB(buffer, 0, playloadlength); switch (typeId) { case 0: case 1: case 2: { var viewer = BitConverter.ToUInt32(buffer.Take(4).Reverse().ToArray(), 0); ReceivedUserCount?.Invoke(this, new SocketReceivedUserCountArgs() { RoomID = RoomID, UserCount = viewer }); break; } case 3: case 4: { var json = Encoding.UTF8.GetString(buffer, 0, playloadlength); try { BilibiliLiveDanmaku_SocketReceiveData dama = new BilibiliLiveDanmaku_SocketReceiveData(json, 2); ReceivedDanmaku?.Invoke(this, new SocketReceivedDanmakuArgs() { RoomID = RoomID, Danmaku = dama }); } catch (Exception) { } break; } case 5: { break; } case 7: { break; } case 16: { break; } default: { break; } } } } catch (NotSupportedException ex) { Disconnect(ex); } catch (Exception ex) { Disconnect(ex); } }