亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解如何在Java中實(shí)現(xiàn)屏幕共享

 更新時(shí)間:2024年10月31日 08:25:01   作者:TeamDev  
在本文中,將為大家展示如何利用 JxBrowser 的功能,實(shí)現(xiàn)運(yùn)行在不同電腦上的兩個(gè) Java 應(yīng)用程序之間的屏幕共享,感興趣的小伙伴可以參考一下

遠(yuǎn)程屏幕共享廣泛運(yùn)用于各種應(yīng)用和服務(wù)中,從網(wǎng)絡(luò)會(huì)議到遠(yuǎn)程訪問應(yīng)用都離不開它的支持。后臺(tái)員工可以使用它向一線同事咨詢問題,技術(shù)支持專家也可以通過它查看客戶看到的精確畫面。

盡管市面上有像 TeamViewer 這樣的第三方應(yīng)用可供選擇,但如果您希望直接在 Java 應(yīng)用程序中集成遠(yuǎn)程訪問功能,那么,您可能需要考慮另一種解決方案。

在本文中,我將向您展示如何利用 JxBrowser 的功能,實(shí)現(xiàn)運(yùn)行在不同電腦上的兩個(gè) Java 應(yīng)用程序之間的屏幕共享。

JxBrowser 作為一款強(qiáng)大的跨平臺(tái) Java 庫,它不僅能夠?qū)⒒?Chromium 的 Web 瀏覽器控件無縫集成到您的 Java Swing、JavaFX、SWT 應(yīng)用程序中,同時(shí)還提供了對(duì) Chromium 數(shù)百種強(qiáng)大功能的支持,這為我們實(shí)現(xiàn)屏幕共享提供了很大便利。

為了在 Java 中實(shí)現(xiàn)屏幕共享,我將利用 Chromium 內(nèi)置的屏幕共享功能,并結(jié)合 JxBrowser 提供的編程接口進(jìn)行操作。

概述

該項(xiàng)目包含兩部分: 一是基于 Node.js 的服務(wù)器;二是兩個(gè)獨(dú)立的 Java 應(yīng)用程序。

服務(wù)器是一個(gè)簡化的 WebRTC 服務(wù)器實(shí)現(xiàn)。項(xiàng)目的這一部分包含了用于連接到服務(wù)器并啟動(dòng)屏幕共享會(huì)話的 JavaScript 代碼。

Java 客戶端是兩個(gè)桌面應(yīng)用程序。第一個(gè)應(yīng)用程序是一個(gè)帶有按鈕的窗口。點(diǎn)擊按鈕將啟動(dòng)共享會(huì)話。第二個(gè)應(yīng)用程序則會(huì)自動(dòng)接收視頻流并顯示它。同時(shí)還有一個(gè)按鈕用于停止屏幕共享。

WebRTC 服務(wù)器

WebRTC 服務(wù)器被配置為支持兩個(gè)客戶端之間的交互:一個(gè)流媒體發(fā)送端(streamer)和一個(gè)接收端(receiver)。該服務(wù)器提供兩個(gè)靜態(tài)頁面,分別是 streamer.html 和 receiver.html。

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');
});

每個(gè) HTML 文件都包含了 JavaScript 代碼,這段代碼負(fù)責(zé)連接至服務(wù)器并通過 WebRTC 建立屏幕共享。當(dāng)流媒體發(fā)送端開始捕獲屏幕時(shí),我們會(huì)將其屏幕視圖作為視頻流接收。為了顯示這個(gè)視頻流,我們會(huì)在接收端使用內(nèi)置的 HTML5 視頻播放器。

為了檢查一切是否正常,讓我們打開兩個(gè)瀏覽器窗口親自查看一下。

Java 客戶端

接下來,讓我們實(shí)現(xiàn) Java 客戶端,并將它們與 JavaScript 應(yīng)用程序集成。我們需要初始化一個(gè)空的 Gradle 項(xiàng)目,并使用 JxBrowser Gradle 插件添加 JxBrowser 的依賴項(xiàng)。

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

jxbrowser {
    version = "{version}"
}

dependencies {
    // 檢測當(dāng)前平臺(tái)并添加相應(yīng)的 Chromium 二進(jìn)制文件。 
    implementation(jxbrowser.currentPlatform)

    // 添加對(duì) Swing 集成的依賴項(xiàng)。
    implementation(jxbrowser.swing)
}

流媒體發(fā)送端應(yīng)用

讓我們從一個(gè)將要共享其屏幕的應(yīng)用程序開始。

我們需要代表流媒體發(fā)送端連接到服務(wù)器。首先,需要?jiǎng)?chuàng)建 Engine 和 Browser 的實(shí)例:

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

然后加載所需的 URL:

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

一旦 URL 加載完畢,我們便可以訪問 streamer.html 中的 JavaScript 代碼,以及可以在 Java 中通過按鈕點(diǎn)擊直接開始屏幕共享:

JButton startSharingButton = new JButton("共享您的屏幕");

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

默認(rèn)情況下,當(dāng)網(wǎng)頁想要捕獲屏幕上的視頻時(shí),Chromium 會(huì)彈出一個(gè)對(duì)話框供用戶選擇捕獲源。不過,借助 JxBrowser API,我們可以直接在代碼中指定捕獲源,從而省去手動(dòng)選擇的步驟:

browser.set(StartCaptureSessionCallback.class, (params, tell) -> {
    CaptureSources sources = params.sources();
    // 共享整個(gè)屏幕。
    CaptureSource screen = sources.screens().get(0);
    tell.selectSource(screen, AudioCaptureMode.CAPTURE);
});

讓我們保存 CaptureSession 的實(shí)例,以便稍后可以通過編程方式停止它。

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

為此,我們需要一個(gè)不同的按鈕:

JButton stopSharingButton = new JButton("停止共享");
stopSharingButton.addActionListener(e -> {
   captureSession.stop();
});

接收端應(yīng)用

在接收端應(yīng)用中,我們將顯示共享的屏幕。

和流媒體發(fā)送端應(yīng)用一樣,我們需要連接到 WebRTC 服務(wù)器,但這次是作為接收端。因此,我們需要?jiǎng)?chuàng)建 Engine 和 Browser 實(shí)例,并導(dǎo)航到接收端的 URL:

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

為了在 Java 應(yīng)用程序中顯示流媒體發(fā)送端的屏幕,讓我們創(chuàng)建一個(gè) Swing 的 BrowserView 組件,并將其嵌入到 JFrame 中:

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

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

BrowserView 組件將顯示加載的網(wǎng)頁內(nèi)容,包括 HTML5 視頻播放器,這樣我們就可以看到流媒體發(fā)送端的屏幕了。

就是這樣!

代碼示例在 Apache License 2.0 許可下提供,并可在 GitHub 上獲取。您可以在不同的終端中運(yùn)行以下命令來啟動(dòng) WebRTC 服務(wù)器和兩個(gè) Java 應(yīng)用程序:

cd server && node server.js
cd clients && ./gradlew runStreamer
cd clients && ./gradlew runReceiver

源代碼

該項(xiàng)目的源代碼可在 GitHub 上獲取。

結(jié)論

在本文中,我向您展示了如何利用 JxBrowser 在一個(gè) Java 應(yīng)用程序中實(shí)現(xiàn)屏幕共享,并在另一個(gè) Java 應(yīng)用程序中顯示它。

我創(chuàng)建了一個(gè)簡單的 JavaScript 屏幕共享應(yīng)用。然后使用 JxBrowser 將其集成到了兩個(gè) Swing 應(yīng)用程序中。

借助 JxBrowser 提供的捕獲 API,我很快就為標(biāo)準(zhǔn)的 Java 應(yīng)用程序增加了屏幕共享功能。

到此這篇關(guān)于詳解如何在Java中實(shí)現(xiàn)屏幕共享的文章就介紹到這了,更多相關(guān)Java屏幕共享內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)JDBC批量插入原理詳解

    Java實(shí)現(xiàn)JDBC批量插入原理詳解

    在JDBC中,executeBatch這個(gè)方法可以將多條dml語句批量執(zhí)行,效率比單條執(zhí)行executeUpdate高很多,這是什么原理呢?在mysql和oracle中又是如何實(shí)現(xiàn)批量執(zhí)行的呢?本文將給大家介紹這背后的原理
    2023-03-03
  • java compare compareTo方法區(qū)別詳解

    java compare compareTo方法區(qū)別詳解

    本文主要介紹了java compare compareTo方法區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java編程通過list接口實(shí)現(xiàn)數(shù)據(jù)的增刪改查代碼示例

    Java編程通過list接口實(shí)現(xiàn)數(shù)據(jù)的增刪改查代碼示例

    這篇文章是介紹Java編程基礎(chǔ)方面的內(nèi)容,涉及l(fā)ist接口的操作,通過list接口實(shí)現(xiàn)對(duì)數(shù)據(jù)的增刪改查的相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Java web基礎(chǔ)學(xué)習(xí)之開發(fā)環(huán)境篇(詳解)

    Java web基礎(chǔ)學(xué)習(xí)之開發(fā)環(huán)境篇(詳解)

    下面小編就為大家?guī)硪黄狫ava web基礎(chǔ)學(xué)習(xí)之開發(fā)環(huán)境篇(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 一文了解MyBatis Plus批量數(shù)據(jù)插入功能

    一文了解MyBatis Plus批量數(shù)據(jù)插入功能

    mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了MyBatis Plus批量數(shù)據(jù)插入功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn)

    Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Data Jpa 復(fù)合主鍵的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • spring security動(dòng)態(tài)配置url權(quán)限的2種實(shí)現(xiàn)方法

    spring security動(dòng)態(tài)配置url權(quán)限的2種實(shí)現(xiàn)方法

    對(duì)于使用spring security來說,存在一種需求,就是動(dòng)態(tài)去配置url的權(quán)限,即在運(yùn)行時(shí)去配置url對(duì)應(yīng)的訪問角色。下面這篇文章主要給大家介紹了關(guān)于spring security動(dòng)態(tài)配置url權(quán)限的2種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-06-06
  • mybatis那些約定的配置你真的都了解嗎(經(jīng)驗(yàn)總結(jié))

    mybatis那些約定的配置你真的都了解嗎(經(jīng)驗(yàn)總結(jié))

    mybatsi中Mapper和xml文件之間有很多約定俗稱的規(guī)則,比如名稱匹配,包掃描,別名等,這些規(guī)則是什么。如果想更加靈活,該如何配置呢?今天就給大家講一下如何配置mybatsi的xml文件
    2021-06-06
  • 基于Java+SpringBoot+Vue前后端分離實(shí)現(xiàn)倉庫管理系統(tǒng)

    基于Java+SpringBoot+Vue前后端分離實(shí)現(xiàn)倉庫管理系統(tǒng)

    這篇文章主要介紹了一個(gè)完整的倉庫管理系統(tǒng)是基于Java+Springboot + Vue前后端分離編寫的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 詳解Java中Collections.sort排序

    詳解Java中Collections.sort排序

    Comparator是個(gè)接口,可重寫compare()及equals()這兩個(gè)方法,接下來通過本文給大家介紹Java中Collections.sort排序,需要的的朋友參考下吧
    2017-04-04

最新評(píng)論