Базовый SFU SDK для g365sfu

This commit is contained in:
RoyceDa
2026-03-10 16:06:11 +02:00
parent d679a53f6e
commit b84f69da33
9 changed files with 305 additions and 11 deletions

View File

@@ -0,0 +1,77 @@
package io.g365sfu;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import io.g365sfu.exception.SFUException;
import io.g365sfu.exception.SFUHandshakeException;
import io.g365sfu.net.SfuSock;
public class SFU {
private String serverAddress;
private String secretKey;
private SfuSock socket;
/**
* Конструктор для создания объекта SFU, который будет использоваться для установления соединения с SFU сервером.
* @param serverAddress адрес SFU сервера в формате "host:port", например "sfu.example.com:8080"
* @param secretKey секретный ключ для аутентификации с SFU сервером, который должен быть согласован с настройками сервера.
*/
public SFU(String serverAddress, String secretKey) {
this.serverAddress = serverAddress;
this.secretKey = secretKey;
}
/**
* Установить соединение с SFU сервером и начать обмен рукопожатиями для аутентификации и установления безопасного канала связи.
* @throws URISyntaxException если адрес сервера имеет неправильный формат
* @throws InterruptedException если соединение было прервано во время попытки подключения
* @throws SFUException если не удалось установить соединение с SFU сервером или если соединение было установлено,
* но не открыто после подключения
* @throws TimeoutException не удалось обменяться рукопожатиями с SFU сервером в течение 30 секунд
* @throws ExecutionException если во время обмена рукопожатиями произошла ошибка выполнения
* @throws SFUHandshakeException если обмен рукопожатиями с SFU завершился неудачно (например, плохой ключ)
*/
public void connect() throws URISyntaxException, InterruptedException, SFUException, ExecutionException, TimeoutException, SFUHandshakeException {
this.socket = new SfuSock(this.serverAddress);
boolean connected = this.socket.connectBlocking(30, TimeUnit.SECONDS);
if(!connected){
throw new SFUException("Failed to connect to SFU server, timeout after 30 seconds: " + this.serverAddress);
}
if(!this.socket.isOpen()) {
throw new SFUException("Connection to SFU server at " + this.serverAddress + " is not open");
}
boolean estabilished = this.socket.handshakeExchange(this.secretKey).get(30, TimeUnit.SECONDS);
if(!estabilished) {
throw new SFUHandshakeException("Failed to establish handshake with SFU server at " + this.serverAddress);
}
}
/**
* Получить адрес SFU сервера, к которому установлено соединение
* @return адрес SFU сервера
*/
public String getServerAddress() {
return this.serverAddress;
}
/**
* Получить соединение к SFU серверу, если оно было установлено
* @return объект SfuSock, представляющий соединение к SFU серверу
*/
public SfuSock getConnection() {
return this.socket;
}
/**
* Проверить, установлено ли соединение с SFU сервером и открыто ли оно
* @return true, если соединение установлено и открыто, false в противном случае
*/
public boolean isOpen() {
return this.socket != null && this.socket.isOpen();
}
}