Реализация звонков на сервере #15

Merged
Royce59 merged 19 commits from dev into main 2026-03-18 17:36:43 +00:00
3 changed files with 86 additions and 0 deletions
Showing only changes of commit 6071e4ddbd - Show all commits

View File

@@ -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<SDPOffer> onSdpOffer;
/**
* Потребитель для обработки сообщений от сервера SFU о том, что комната была удалена.
* Передает ID удаленной комнаты, чтобы клиент мог удалить ее из своего списка комнат и прекратить попытки взаимодействия с ней.
*/
private Consumer<String> onDeleteRoom;
/**
* Потребитель для обработки сообщений от сервера SFU о том, что участник отключился от комнаты.
* Передает объект DisconnectedPeer, который содержит информацию об отключившемся участнике и комнате, от которой он отключился
*/
private Consumer<DisconnectedPeer> 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<SDPOffer> onSdpOffer) {
this.onSdpOffer = onSdpOffer;
}
/**
* Устанавливает потребителя для обработки сообщений от сервера SFU о том, что комната была удалена.
* @param onDeleteRoom потребитель, который будет вызываться при получении сообщения от сервера SFU с кодом 0x10,
* содержащим информацию о том, что комната была удалена. Параметром будет строка, содержащая ID удаленной комнаты,
* чтобы клиент мог удалить ее из своего списка комнат и прекратить попытки взаимодействия с ней.
*/
public void setDeleteRoomConsumer(Consumer<String> onDeleteRoom) {
this.onDeleteRoom = onDeleteRoom;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}