O compartilhamento remoto de tela é utilizado em várias aplicações e serviços, desde conferências Web a aplicações de acesso remoto. Um funcionário de back-office pode utilizá-lo para consultar um colega na linha da frente ou um especialista de suporte técnico pode utilizá-lo para ver exatamente o que o seu cliente vê.

Pode acessar a uma aplicação de terceiros como o TeamViewer. Mas e se você precisar ter as capacidades de acesso remoto diretamente em a sua aplicação Java? Neste caso, pode querer ir em outra direção.

Neste artigo, mostrarei uma abordagem que permite implementar o compartilhamento de tela entre duas aplicações Java executadas em PCs diferentes utilizando as capacidades do JxBrowser.

O JxBrowser é uma biblioteca Java multiplataforma que permite integrar o controle do navegador Web baseado no Chromium nas suas aplicações Java Swing, JavaFX, SWT e utilizar centenas de funcionalidades do Chromium.

Para implementar compartilhamento de tela no Java, vou utilizar o fato de o Chromium suportar compartilhamento de tela de imediato e o JxBrowser fornecer acesso programático a isso.

Visão geral 

O projeto consiste em duas partes: o servidor em Node.js e duas aplicações Java.

O servidor é uma implementação simplista de um servidor WebRTС. Esta parte do projeto contém o código JavaScript para ligar a o servidor e iniciar a sessão de compartilhamento de tela.

Os clientes Java são duas aplicações de ambiente de trabalho. A primeira é uma janela com um botão. Clicar no botão inicia a sessão de compartilhamento de tela. A segunda aplicação recebe automaticamente o fluxo de vídeo e mostra-o. E existe  um botão para parar o compartilhamento de tela.

Diagrama do servidor WebRTC

Servidor WebRTC 

O servidor WebRTC é configurado para interacção entre dois clientes: um streamer e um receptor. Serve duas páginas estáticas, streamer.html e receiver.html, respectivamente.

const app = express();

app.use(express.static('public'));

app.get('/streamer', (req, res) => {
   res.sendFile(rootPath + 'public/streamer.html');
});

app.get('/receiver', (req, res) => {
   res.sendFile(rootPath + 'public/receiver.html');
});

Cada arquivo HTML contém código JavaScript que liga ao servidor e configura compartilhamento de tela através de WebRTC. Quando um streamer começa a capturar, nós recebemos a sua visualização de tela como um fluxo de vídeo. Para mostrar, utilizamos o leitor de vídeo HTML5 incorporado no lado receptor.

Diagrama do servidor Web

Para verificar se tudo está funcionando bem, vamos abrir duas janelas do browser e ver por nós mesmos.

Pré-visualização do streamer e do receptor

Clientes Java 

Vamos implementar clientes Java e integrá-los com a aplicação JavaScript. Nós precisamos inicializar um projeto Gradle vazio e adicionar dependências do JxBrowser usando JxBrowser Gradle Plug-in.

plugins {
    
    id("com.teamdev.jxbrowser") version "1.2.1"
}

jxbrowser {
    version = "8.2.1"
}

dependencies {
    // Detecta a plataforma atual e adiciona os binários Chromium correspondentes. 
    implementation(jxbrowser.currentPlatform)

    // Adiciona uma dependência à integração do Swing.
    implementation(jxbrowser.swing)
}

Aplicação Streamer 

Vamos começar com uma aplicação que irá compartilhar a sua tela.

Precisamos ligar ao servidor em nome do streamer. Primeiro, precisamos criar instâncias do Engine e do Navegador:

Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);
Browser browser = engine.newBrowser();

E carregar o URL necessário:

browser.navigation().loadUrlAndWait("http://localhost:3000/streamer");

Assim que o URL é carregado, acessamos o código JavaScript em streamer.html e podemos iniciar o compartilhamento de tela diretamente a partir do Java com um clique no botão:

JButton startSharingButton = new JButton("Partilhe o seu ecrã");

startSharingButton.addActionListener(e -> {
   browser.mainFrame().ifPresent(mainFrame ->    
       mainFrame.executeJavaScript("startScreenSharing()"));
});

Por padrão, quando uma página Web pretende capturar vídeo da tela, o Chromium apresenta uma caixa de diálogo onde podemos escolher uma fonte de captura. Com a API JxBrowser, podemos escolher a fonte de captura no código:

browser.set(StartCaptureSessionCallback.class, (params, tell) -> {
    CaptureSources sources = params.sources();
    // Compartilhar a tela inteira.
    CaptureSource screen = sources.screens().get(0);
    tell.selectSource(screen, AudioCaptureMode.CAPTURE);
});

Vamos salvar a instância de CaptureSession, para que possamos programaticamente pará-la mais tarde.

private CaptureSession captureSession;

browser.on(CaptureSessionStarted.class, event -> 
    captureSession = event.capture()
);

Precisamos de um botão diferente para este efeito:

JButton stopSharingButton = new JButton("Parar de partilhar");
stopSharingButton.addActionListener(e -> {
   captureSession.stop();
});

Aplicação do receptor 

Na aplicação receptora, mostraremos a tela compartilhada.

Tal como na aplicação streamer, precisamos ligar ao servidor WebRTC, mas desta vez como um receptor. Portanto, crie instâncias do Engine e do Navegador e navegue para o URL do receptor:

Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);
Browser browser = engine.newBrowser();
browser.navigation().loadUrlAndWait("http://localhost:3000/receiver");

Para apresentar a tela do streamer numa aplicação Java, vamos criar a componente Swing BrowserView e incorporá-la no JFrame:

private static void initUI(Browser browser) {
   BrowserView view = BrowserView.newInstance(browser);

   JFrame frame = new JFrame("Receptor");
   frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
   frame.setSize(700, 500);
   frame.add(view, BorderLayout.CENTER);
   frame.setLocationRelativeTo(null);
   frame.setVisible(true);
}

O componente BrowserView apresentará o conteúdo da página Web carregada com o leitor de vídeo HTML5, e poderemos ver a tela do streamer.

É isso!

Pré-visualização do receptor

Os exemplos de código são fornecidos sob a Licença Apache 2.0 e estão disponíveis em GitHub. Pode iniciar o servidor WebRTC e os dois aplicativos Java executando os seguintes comandos em terminais diferentes:

cd server && node server.js
cd clients && ./gradlew runStreamer
cd clients && ./gradlew runReceiver
Veja o que pode fazer com JxBrowser!
Teste agora

Código fonte 

O código-fonte do projeto está disponível em GitHub.

Conclusão 

Neste artigo, mostrei-lhe como  fazer o compartilhamento de tela numa aplicação Java e apresentá-lo noutra aplicação utilizando JxBrowser.

Criei uma aplicação JavaScript simples que pode compartilhar a tela. Em seguida, eu integreiu-a em duas aplicações Swing utilizando o JxBrowser.

Com a API de captura fornecida pelo JxBrowser, enriqueci uma aplicação Java normal com a funcionalidade de compartilhamento de tela em pouco tempo.