官术网_书友最值得收藏!

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 服務器端啟動圖

主站蜘蛛池模板: 应用必备| 桐梓县| 界首市| 营口市| 三明市| 通城县| 同心县| 独山县| 韶关市| 长顺县| 昌邑市| 河西区| 都江堰市| 定陶县| 游戏| 伊吾县| 连南| 四川省| 湟中县| 章丘市| 昌乐县| 高邑县| 神池县| 乐平市| 项城市| 南城县| 健康| 固阳县| 宁德市| 拉萨市| 犍为县| 武穴市| 泰和县| 黑河市| 洛阳市| 甘泉县| 湛江市| 斗六市| 灌南县| 蕲春县| 曲阳县|