生活随笔
收集整理的這篇文章主要介紹了
Java web项目中使用C#配合开发,实现双屏显示功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、前言
最近系統開發中,新增了一個需求,要求客戶登記以后,需要有一個對外的屏幕顯示客戶登記信息,方便客戶確認個人信息及相關信息是否有誤。在了解相關需求以后,我打算使用C#來配合實現雙屏顯示功能。作為一名java程序員,在使用C#開發過程中,感覺也挺有意思的,特此,簡單記錄一下實現思路。
二、代碼實現
java服務端
創建一個spring boot項目,項目結構如下:
導入maven依賴:
<dependency><groupId>org
.springframework
.boot<
/groupId><artifactId>spring
-boot
-starter
-web<
/artifactId><
/dependency><dependency><groupId>org
.springframework
.boot<
/groupId><artifactId>spring
-boot
-starter
-test<
/artifactId><scope>test<
/scope><
/dependency>
編寫application.yml配置文件:
server:port: 8080servlet:context
-path:
/dsserver
編寫index.html頁面:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>主頁
</title>
</head>
<body>
<div><button onclick="openDSForm()">打開雙屏顯示
</button><br/><input id="content" type="text"/><button onclick="sendMessage()">發送消息
</button>
</div>
</body>
<script>var spWebsocket;function initSpWebsocket() {if ('WebSocket' in window) {spWebsocket = (spWebsocket && spWebsocket.readyState == spWebsocket.OPEN) ? spWebsocket : new WebSocket("ws://127.0.0.1:59999");spWebsocket.onerror = function (err) {console.log(err);};spWebsocket.onopen = function () {console.log("spWebsocket打開關閉!");};spWebsocket.onmessage = function (event) {console.log(event.data);}spWebsocket.onclose = function () {console.log("spWebsocket連接關閉!");}} else {alert("當前瀏覽器不支持websocket!");}}function openDSForm() {if(!(spWebsocket && spWebsocket.readyState == spWebsocket.OPEN)) {initSpWebsocket();}else {spWebsocket.send("openDS");}}function sendMessage() {if(!(spWebsocket && spWebsocket.readyState == spWebsocket.OPEN)) {initSpWebsocket();}else {var input = document.getElementById("content");var functionName = "acceptMessage"; spWebsocket.send(functionName + "^" + input.value);}}
</script>
</html>
編寫用于雙屏顯示的頁面doubleScreenShow.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>雙屏顯示
</title>
</head>
<body><div><h1 style="color: red">雙屏顯示內容:
<label id="content" ></label></h1></div>
</body><script>function acceptMessage(msg) {var input = document.getElementById("content");input.innerText = msg;}</script>
</html>
開發中,我為了方便,并沒有完全使用C#的窗口控件來做雙屏顯示客戶端,而是只使用了C#窗口控件嵌套瀏覽器頁面的做法,畢竟我對C#了解程度有限,開發時間也不充裕。
編寫TestController,用于轉發雙屏顯示頁面:
@Controller
public class TestController {@GetMapping("/dsShow")public String
dsShow() {return "doubleScreenShow.html";}
}
以上,整個就是服務端的代碼,只是用于演示,整個代碼結構還是很簡單的。
C#雙屏代碼
創建一個C#的winform窗口程序:
管理需要依賴的程序包:
- Fleck:創建websocket服務器需要的引用依賴:
- CefSharp:winform窗口瀏覽器插件內核默認是IE,使用CefSharp相關引用,可以使用谷歌內核的瀏覽器控件:
主窗口代碼:
using CefSharp
.WinForms
;
using System
.Windows
.Forms
;namespace doublescreen_client
{public partial class Form1 : Form{private ChromiumWebBrowser chrome
= null;public Form1(string url
){InitializeComponent();if (url
!= null && !"".Equals(url
)){chrome
= new ChromiumWebBrowser(url
){Dock
= DockStyle
.Fill
};this.Controls
.Add(chrome
);}this.Text
= "雙屏顯示客戶端";this.ShowInTaskbar
= false;this.Hide(); }private delegate void DeletegateShowDSForm();public void DoShow(){if (this.InvokeRequired
){DeletegateShowDSForm dsf
= new DeletegateShowDSForm(ShowDSFrom
);Invoke(dsf
);}else{ShowDSFrom();}}public void ShowDSFrom(){this.TopMost
= true;this.ShowInTaskbar
= true;this.WindowState
= FormWindowState
.Maximized
;this.Visible
= true;this.Activate();this.Show();}public ChromiumWebBrowser GetBrowser(){return this.chrome
;}}
}
Program.cs中的執行邏輯代碼:
using CefSharp
.WinForms
;
using Fleck
;
using System
;
using System
.Diagnostics
;
using System
.Drawing
;
using System
.Windows
.Forms
;namespace doublescreen_client
{static class Program{[STAThread]static void Main(){Application
.EnableVisualStyles();Application
.SetCompatibleTextRenderingDefault(false);bool openFlag
= CheckSoftWareOpenMore("doublescreen-client"); if (openFlag
) {DialogResult result
= MessageBox
.Show("你已經打開一個照相軟件,請勿重復打開!", "提示:", MessageBoxButtons
.OK
, MessageBoxIcon
.Warning
);if (result
== DialogResult
.OK
){System
.Environment
.Exit(0);}}string serverUrl
= "http://localhost:8080/dsserver/dsShow";Form1 form
= new Form1(serverUrl
);ChromiumWebBrowser chrome
= form
.GetBrowser();WebSocketServer server
= new WebSocketServer("ws://127.0.0.1:59999" );server
.RestartAfterListenError
= true;server
.Start(socket
=>{socket
.OnOpen
= () =>{};socket
.OnClose
= () =>{};socket
.OnMessage
= message
=>{if (message
== "ping..."){return;}string[] myParams
= message
.Split('^'); if ("openDS".Equals(myParams
[0])){if (!form
.Visible
|| FormWindowState
.Minimized
.Equals(form
.WindowState
)){form
.DoShow();}return;}if (form
.Visible
){string JSFunction
= myParams
[0] + "('" + myParams
[1] + "')"; chrome
.GetBrowser().MainFrame
.EvaluateScriptAsync(JSFunction
); }};});Screen
[] sc
= Screen
.AllScreens
; int showOnMonitor
= 1; if (sc
.Length
== 1){showOnMonitor
= 0; }form
.StartPosition
= FormStartPosition
.Manual
; form
.Location
= new Point(sc
[showOnMonitor
].Bounds
.Left
, sc
[showOnMonitor
].Bounds
.Top
); form
.WindowState
= FormWindowState
.Minimized
; Application
.Run(form
);}static bool CheckSoftWareOpenMore(string softwareName
){Process
[] processes
= Process
.GetProcessesByName(softwareName
);if (processes
.Length
> 1){return true;}else{return false;}}}
}
三、測試
啟動服務端,訪問:http://localhost:8080/dsserver/index.html:
由于使用了CefSharp,需要配置visual studio 的debug方式,配置管理器,選擇運行平臺:
啟動C#雙屏顯示軟件,由于最開始隱藏了窗口,所以沒有彈窗,可以通過以下標志判斷是否運行:
點擊網頁的【打開雙屏顯示】按鈕:
由于websocket連接需要時間,可能需要多點擊兩次,然后,就可以發現在另外一個屏幕上打開了一個窗口了:
在主屏幕的瀏覽器上發生消息,進行測試:
雙屏頁面:
可以看到雙屏顯示的頁面成功顯示消息了。
四、最后:
這只是提供了一種實現雙屏顯示的思路,java部分的代碼很簡單,由于我對C#也不是很了解,代碼風格應該也不好,大家只做參考,具體實現我就不做過多闡述,免得誤人子弟,大家有興趣看看注釋。
實際業務肯定比這個復雜,原理大概就是這樣,可以通過這個實現原理,把對人員的增刪改查,和一些綁定信息的修改都實時的在對外的屏幕上向用戶顯示。
總結
以上是生活随笔為你收集整理的Java web项目中使用C#配合开发,实现双屏显示功能的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。