- 零基礎學Java項目開發
- 聚慕課教育研發中心編著
- 1141字
- 2022-07-28 18:41:38
5.4 軟件功能技術實現
總體項目的功能技術、構造及代碼的實現是本節中我們需要進行學習的內容。
5.4.1 軟件主界面的實現
客戶端系統主界面由菜單區、界面布局兩個部分組成。
1.菜單部分代碼及注解
start=new JButton("模擬監控"); exitjb=new JButton("退出"); autosend=new JRadioButton("自動發送",false); start.addActionListener(this); exitjb.addActionListener(this); autosend.addActionListener(this); //添加各個組件 mainpanel=new JPanel(new BorderLayout()); JLabel jlable=new JLabel("桌面監控", JLabel.CENTER);//JLable類用來居中對齊 jlable.setFont(new Font("黑體",Font.BOLD,40)); jlable.setForeground(Color.RED); mainpanel.add(jlable,BorderLayout.CENTER);//將jlable放入主面板中,并居中 JPanel menujp=new JPanel(); menujp.add(autosend); menujp.add(start); menujp.add(exitjb); menujp.setBorder(BorderFactory.createTitledBorder("菜單")); this.getContentPane().add(mainpanel,BorderLayout.CENTER); this.getContentPane().add(menujp,BorderLayout.SOUTH); this.setSize(600,500); this.setLocationRelativeTo(null);//設置窗口相對于組件的位置 this.setVisible(true);//顯示窗口 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
在Java中,桌面程序通過引入awt/swing組件兩種方式實現。界面布局可以通過選擇默認布局或自定義布局實現構建,然后把定義的功能按鈕顯示信息等加入到布局中。在上述代碼中,分別創建了兩個JButton按鈕和一個JRadioButton單選按鈕,并把3個按鈕增加到mainpanel布局中。
為了實現在客戶端顯示多個截圖信息,創建一個JTabbedPane分頁控件,然后每截一個圖片創建一個新的分頁標簽,并顯示截圖信息。代碼如下:

2.界面效果代碼及注解
按鈕動作監聽器實現代碼如下:

客戶端主界面運行效果如圖5-2所示。

圖5-2 客戶端主界面運行效果圖
5.4.2 與服務器端建立socket通信的實現
為了實現與服務器端進行socket通信,客戶端需要建立socket輸入/輸出流處理,代碼如下:

DataInputStream為輸入數據流,接收到的文字信息通過readUTF()進行讀取。DataOutputStream為輸出數據流,需要發送信息時使用該定義變量處理。
5.4.3 截圖并發送實現
在Java中有個Robot類,可以模擬鼠標、鍵盤的操作。通過該類模擬選擇截圖選區進行截圖,部分按鈕設置的相關代碼如下:

上述代碼中,函數ImageIO.write()實現對截圖文件的保存;函數SendImage(name)用于發送截圖信息;函數updates()實現截圖信息的刷新。SendImages()函數的代碼如下:

在上述代碼中,發送完截圖信息后,又特意發送一個字節長度的數字1給服務器端,作為服務器端判斷圖片信息接收完成的標志,這在socket通信中具有非常重要的意義。由于每次發送的數據包長不固定,因此需要為每個發包信息指定一個結束標志,通常會在每個發包前取幾個字節用來存放數據包類型和數據包長度。而服務器端在接收時會根據包的類型和長度進行解包處理。
自動截圖發送通過一個延時線程實現,代碼如下:
public void runTask() { final long timeInterval = 10000; //每隔10s運行一次 Runnable runnable = new Runnable() { public void run() { while (true) { //你要運行的程序 doStart(); try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread t=new Thread(runnable); t.start(); }
觸發后,線程每隔10s執行一次。
5.4.4 服務器端建立連接、接收實現
服務器端首先要創建一個socket服務,等待客戶端的接入,代碼如下:

當客戶端接入后,服務器端會向客戶端發送一條信息表示通知接入成功。在服務器端接收數據使用函數receiveFile( ),其代碼如下:

通過以上代碼可知,客戶端發送1長度字節數據,這里用來判斷一個圖片信息包接收完成,開啟接收新的圖片信息包。
5.4.5 服務器端顯示接收圖片信息實現
服務器端圖片顯示可以分為啟動后初始顯示和接收圖片信息包后圖片的刷新。這里不同于客戶端的實現,只需要刷新一下默認顯示圖片即可,無須tab標簽頁。主要代碼如下:


服務器端啟動,如圖5-3所示。

圖5-3 服務器端啟動圖
- Microsoft Application Virtualization Cookbook
- C/C++算法從菜鳥到達人
- 深入淺出Spring Boot 2.x
- Python GUI Programming Cookbook
- Terraform:多云、混合云環境下實現基礎設施即代碼(第2版)
- 編寫高質量代碼:改善Objective-C程序的61個建議
- Geospatial Development By Example with Python
- Instant Debian:Build a Web Server
- JavaScript+jQuery網頁特效設計任務驅動教程
- SSH框架企業級應用實戰
- Python深度學習(第2版)
- Serverless工程實踐:從入門到進階
- KnockoutJS Blueprints
- GO語言編程從入門到實踐
- Kotlin入門與實戰