From 6071e4ddbda71838a0e8d8d66ac01661bc1aeee8 Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Mon, 16 Mar 2026 18:29:01 +0200 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= =?UTF-8?q?=20ROOM=5FDELETE=20=D0=B8=20PEER=5FDISCONNECTED?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/g365sfu/SFU.java | 54 +++++++++++++++++++ .../java/io/g365sfu/net/DisconnectedPeer.java | 28 ++++++++++ src/main/java/io/g365sfu/net/Incoming.java | 4 ++ 3 files changed, 86 insertions(+) create mode 100644 src/main/java/io/g365sfu/net/DisconnectedPeer.java diff --git a/src/main/java/io/g365sfu/SFU.java b/src/main/java/io/g365sfu/SFU.java index 6296872..a058deb 100644 --- a/src/main/java/io/g365sfu/SFU.java +++ b/src/main/java/io/g365sfu/SFU.java @@ -12,6 +12,7 @@ import java.util.function.Consumer; import io.g365sfu.exception.SFUException; import io.g365sfu.exception.SFUHandshakeException; +import io.g365sfu.net.DisconnectedPeer; import io.g365sfu.net.Incoming; import io.g365sfu.net.Outgoing; import io.g365sfu.net.SfuSock; @@ -49,6 +50,18 @@ public class SFU { private Consumer onSdpOffer; + /** + * Потребитель для обработки сообщений от сервера SFU о том, что комната была удалена. + * Передает ID удаленной комнаты, чтобы клиент мог удалить ее из своего списка комнат и прекратить попытки взаимодействия с ней. + */ + private Consumer onDeleteRoom; + + /** + * Потребитель для обработки сообщений от сервера SFU о том, что участник отключился от комнаты. + * Передает объект DisconnectedPeer, который содержит информацию об отключившемся участнике и комнате, от которой он отключился + */ + private Consumer onPeerDisconnected; + /** * Конструктор для создания объекта SFU, который будет использоваться для установления соединения с SFU сервером. * @param serverAddress адрес SFU сервера в формате "host:port", например "sfu.example.com:8080" @@ -171,6 +184,37 @@ public class SFU { } return; } + if(packetId == Incoming.ROOM_DELETE) { + int roomIdLength = message.getInt(); + byte[] roomIdBytes = new byte[roomIdLength]; + message.get(roomIdBytes); + String roomId = new String(roomIdBytes).trim(); + this.rooms.remove(roomId); + if(this.onDeleteRoom != null) { + this.onDeleteRoom.accept(roomId); + } + } + if(packetId == Incoming.PEER_DISCONNECTED) { + int roomIdLength = message.getInt(); + byte[] roomIdBytes = new byte[roomIdLength]; + message.get(roomIdBytes); + String roomId = new String(roomIdBytes).trim(); + int peerIdLength = message.getInt(); + byte[] peerIdBytes = new byte[peerIdLength]; + message.get(peerIdBytes); + String peerId = new String(peerIdBytes).trim(); + Room room = this.rooms.get(roomId); + DisconnectedPeer disconnectedPeer = new DisconnectedPeer(peerId, roomId, room); + if(room != null) { + /** + * Если такая комната существует то удаляем оттуда участника + */ + room.removeParticipant(peerId); + } + if(this.onPeerDisconnected != null) { + this.onPeerDisconnected.accept(disconnectedPeer); + } + } } /** @@ -301,4 +345,14 @@ public class SFU { public void setOfferConsumer(Consumer onSdpOffer) { this.onSdpOffer = onSdpOffer; } + + /** + * Устанавливает потребителя для обработки сообщений от сервера SFU о том, что комната была удалена. + * @param onDeleteRoom потребитель, который будет вызываться при получении сообщения от сервера SFU с кодом 0x10, + * содержащим информацию о том, что комната была удалена. Параметром будет строка, содержащая ID удаленной комнаты, + * чтобы клиент мог удалить ее из своего списка комнат и прекратить попытки взаимодействия с ней. + */ + public void setDeleteRoomConsumer(Consumer onDeleteRoom) { + this.onDeleteRoom = onDeleteRoom; + } } diff --git a/src/main/java/io/g365sfu/net/DisconnectedPeer.java b/src/main/java/io/g365sfu/net/DisconnectedPeer.java new file mode 100644 index 0000000..d74e2fd --- /dev/null +++ b/src/main/java/io/g365sfu/net/DisconnectedPeer.java @@ -0,0 +1,28 @@ +package io.g365sfu.net; + +import io.g365sfu.Room; + +public class DisconnectedPeer { + + private String peerId; + private Room room; + private String roomId; + + public DisconnectedPeer(String peerId, String roomId, Room room) { + this.peerId = peerId; + this.room = room; + this.roomId = roomId; + } + + public String getPeerId() { + return peerId; + } + + public Room getRoom() { + return room; + } + + public String getRoomId() { + return roomId; + } +} diff --git a/src/main/java/io/g365sfu/net/Incoming.java b/src/main/java/io/g365sfu/net/Incoming.java index c8630ff..3ab8367 100644 --- a/src/main/java/io/g365sfu/net/Incoming.java +++ b/src/main/java/io/g365sfu/net/Incoming.java @@ -16,4 +16,8 @@ public class Incoming { public static final byte ROOM_CREATE= (byte) 0x02; + public static final byte ROOM_DELETE = (byte) 0x10; + + public static final byte PEER_DISCONNECTED = (byte) 0x11; + }