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 服务器端启动图