O exemplo neste artigo descreve como Java implementa a transmissão de tela controlando o mouse. Compartilhe com todos para sua referência. A análise específica é a seguinte:
No artigo anterior “Análise de exemplos de implementação da função de compartilhamento de tela em Java”, foi mencionado que não há mouse ao capturar a tela. Para ver o mouse na interface do professor, você pode desenhar o mouse em cada captura de tela quando. capturando a tela. No entanto, como as capturas de tela são tiradas uma por uma, o mouse que você vê inevitavelmente ficará um pouco preso. Eu escrevi um miniaplicativo de controle de mouse Java antes e você pode ver a demonstração do mouse desta forma.
O método de implementação também é bastante simples. Os dois artigos anteriores implementaram funções de controle de mouse e compartilhamento de tela sem mouse, respectivamente.
No lado do servidor, SendScreenImg e SendMouseMessage são considerados duas classes de ferramentas, ouvindo portas diferentes, respectivamente. Ambos implementam a classe Thread e usamos a classe ExecutorService do pool de threads para controlá-los.
Duas portas são usadas, porque ainda não sei como enviar as informações do mouse e as informações da imagem juntas. Talvez eu possa converter a imagem em uma matriz de bytes e colocar as coordenadas do mouse na frente da matriz, mas neste caso o. mouse pode não Será incoerente, porque a velocidade de transmissão das coordenadas do mouse será mais rápida do que a transmissão das imagens. Bem, tente novamente quando tiver tempo.
A analogia do cliente é a mesma acima.
Aqui está o código:
Servidor:
Programa principal:
Copie o código do código da seguinte forma:/*
* A classe de transmissão de tela chama duas classes de ferramentas: uma classe para enviar informações de captura de tela e uma classe para enviar informações de mouse, usando o pool de threads.
*/
classe pública BroderCast {
público estático void principal(String[] args)
{
novo BroderCast();
System.out.println("Iniciar");
}
BroderCast público()
{
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(new SendScreenImg());
executor.execute(new SendMouseMessage());
}
}
Envie o código da captura de tela:
Copie o código da seguinte forma: import java.awt.Dimension;
importar java.awt.Rectangle;
importar java.awt.Robot;
importar java.awt.Toolkit;
importar java.awt.image.BufferedImage;
importar java.io.DataOutputStream;
importar java.io.IOException;
importar java.net.ServerSocket;
importar java.net.Socket;
importar java.util.zip.ZipEntry;
importar java.util.zip.ZipOutputStream;
importar javax.imageio.ImageIO;
/*
* Ferramentas: Envie informações de captura de tela do lado do professor para o aluno. Não há informações do mouse e a porta 8002 é usada.
* As informações do mouse podem ser desenhadas no componente da imagem enviada, para que as informações do mouse possam ser visualizadas na interface do aluno. Esta função ainda não foi implementada.
*
*/
classe pública SendScreenImg estende Thread
{
public int serverPort = 8002;
servidorSocket privado serverSocket;
robô robô privado;
tela de dimensão pública;
retângulo público retângulo;
tomada privada;
público estático void principal(String args[])
{
new SendScreenImg().start();
}
public void changeServerPort(int serverPort)
{
if(this.serverPort == serverPort) retornar;
tentar{
this.serverSocket.close(); //É necessário fechar a porta atual primeiro
this.serverPort = serverPort;
serverSocket = novo ServerSocket(this.serverPort);
serverSocket.setSoTimeout(8000000);
}catch(Exceção e){}
}
//Método de construção para abrir o robô de conexão do soquete e obter o tamanho da tela
SendScreenImg público()
{
tentar {
serverSocket = new ServerSocket(getServerPort());
serverSocket.setSoTimeout(864000000);
robô = novo Robô();
} catch (Exceção e) {
e.printStackTrace();
}
screen = Toolkit.getDefaultToolkit().getScreenSize(); //Obter o tamanho da tela principal
rect = new Rectangle(screen); //Constrói um retângulo de tamanho correspondente
}
@Substituir
execução de vazio público ()
{
//Aguardando em tempo real para receber mensagens de captura de tela
enquanto(verdadeiro){
tentar {
soquete = serverSocket.accept();
ZipOutputStream zip = new ZipOutputStream(new DataOutputStream(socket.getOutputStream()));
zip.setLevel(9); //Definir o nível de compactação
tentar{
BufferedImage img = robot.createScreenCapture(rect);
zip.putNextEntry(new ZipEntry("teste.jpg"));
ImageIO.write(img, "jpg", zip);
if(zip!=null)zip.close();
System.out.println("A porta do aluno está conectada");
} catch (IOException ioe) {
System.out.println("terminal controlado: desconectar");
}
} catch (IOException ioe) {
System.out.println("Erro de conexão");
} finalmente {
if (soquete! = nulo) {
tentar {
soquete.close();
} catch (IOException e) {
}
}
}
}
}
}
Envie informações do mouse:
Copie o código do código da seguinte forma:/*
* Aula de ferramenta: obtenha informações do mouse e envie para o terminal do aluno
*/
classe pública SendMouseMessage estende Thread{
privado int OPERATE_PORT = 8001;
servidor ServerSocket privado;
tomada privada;
string privada operaStr;
público estático void principal(String[] args)
{
new SendMouseMessage().start();
}
public SendMouseMessage(){
tentar {
servidor = novo ServerSocket(OPERATE_PORT);
//JOptionPane.showMessageDialog(null, "começou a escutar");
} catch (IOException e1) {
e1.printStackTrace();
}
}
//Múltiplos threads monitoram o cliente em um loop sem fio
execução de vazio público ()
{
enquanto(verdadeiro){
Ponto ponto = MouseInfo.getPointerInfo().getLocation();
operaStr = "Movemouse,"+ponto.x+","+ponto.y;
tentar {
soquete = servidor.accept();
soquete.setSoTimeout(1000000);
Saída DataOutputStream =new DataOutputStream(socket.getOutputStream());
saída.write(operateStr.getBytes());
output.flush(); //Libere o fluxo de saída e grave todos os bytes de saída em buffer
output.close(); //Fecha o fluxo de saída e libera recursos
System.out.println("INFO: "+operateStr);
} catch (IOException e) {
System.out.println("A conexão foi interrompida");
break; //Para o loop sem fio ao desconectar
}
}
}
}
Cliente:
Programa principal:
Copie o código da seguinte forma: import java.util.concurrent.ExecutorService;
importar java.util.concurrent.Executors;
importar com.Tool.OperateMouse;
importar com.Tool.ReceiveImages;
classe pública ReceiveBroderCast {
executor público ExecutorService;
string estática pública IP = "202.216.60.9";
público estático void principal(String[] args)
{
novo ReceiveBroderCast(IP);
}
public ReceiveBroderCast(String IP) {
executor = Executors.newFixedThreadPool(2);
executor.execute(novo ReceiveImages(IP));
executor.execute(novo OperateMouse(IP));
}
}
Receba o código da captura de tela:
Copie o código do código da seguinte forma:/*
* 2014-11-20
*Esta classe é usada para receber informações da tela do lado do professor, excluindo o mouse
* Use soquete()
*/
classe pública ReceiveImages estende Thread{
quadro BorderInit público;
soquete público;
IP de string pública;
public static void main(String[] args){
new ReceiveImages("202.216.60.7").start();
}
publicReceiveImages(String IP)
{
frame=new BorderInit();
este.IP=IP;
}
execução void pública() {
enquanto(frame.getFlag()){
System.out.println("Conectado"+(System.currentTimeMillis()/1000)%24%60+"segundos");
tentar {
soquete = novo Soquete(IP,8002);
DataInputStream ImgInput = new DataInputStream(socket.getInputStream());
ZipInputStream imgZip = new ZipInputStream(ImgInput);
Imagem img = nulo;
tentar{
imgZip.getNextEntry(); //Vá para o início do fluxo do arquivo Zip
img = ImageIO.read(imgZip); //Lê as imagens no fluxo de imagens Zip de acordo com os bytes
frame.jlbImg.setIcon(new ImageIcon(img));
frame.validate();
}catch (IOException e) {e.printStackTrace();}
tentar{
imgZip.close();
} catch (IOException e) {
System.out.println("Conexão desconectada");
}
tentar {
TimeUnit.MILLISECONDS.sleep(50);//Tempo de intervalo para recebimento de fotos
} catch (InterruptedException, ou seja) {
ou seja,printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}finalmente{
tentar {
soquete.close();
} capturar (IOException e) {}
}
}
}
}
classe BorderInit estende JFrame
{
privado estático final longo serialVersionUID = 1L;
público JLabel jlbImg;
sinalizador booleano privado;
getFlag booleano público(){
retorne este.flag;
}
publicBorderInit()
{
this.flag=true;
this.jlbImg = new JLabel();
this.setTitle("Monitoramento remoto--IP:" + "--Tópico:" );
this.setSize(400, 400);
//this.setUndecorated(true);
//this.setAlwaysOnTop(true); //Sempre no topo
this.add(jlbImg);
this.setLocationRelativeTo(nulo);
this.setExtendedState(Frame.MAXIMIZED_BOTH);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(verdadeiro);
this.validate();
//evento de fechamento da janela
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
sinalizador=falso;
BorderInit.this.dispose();
System.out.println("Formulário fechado");
System.gc();
}
});
}
}
Receba informações do mouse e controle o movimento do mouse:
Copie o código da seguinte forma: import java.awt.AWTException;
importar java.awt.Robot;
importar java.io.BufferedInputStream;
importar java.io.BufferedReader;
importar java.io.DataInputStream;
importar java.io.IOException;
importar java.io.InputStream;
importar java.net.Socket;
importar javax.swing.JOptionPane;
/*
* O controle do mouse do lado do aluno é o mesmo do lado do professor
* Esta classe é responsável por receber informações do mouse e controlar o movimento do mouse usando a função robot.mouseMove()
*/
classe pública OperateMouse estende Thread{
público estático void principal(String[] args)
{
novo OperateMouse("202.116.60.7").start();
}
tomada privada;
IP de string pública;
privado int OPERATE_PORT = 8001;
robô robô privado;
OperateMouse público (String IP)
{
este.IP = IP;
}
execução void pública() {
enquanto(verdadeiro){
tentar {
soquete = novo Soquete(IP,OPERATE_PORT);
robô = novo Robô();
//Obtém informações sobre o movimento do mouse
DataInputStream dataIn = new DataInputStream(socket.getInputStream());
String info="";
int r;
enquanto((r=dataIn.read()) != -1){
info +=""+(char)r; //Converte todos os elementos da matriz de bytes para o tipo de caractere
}
dataIn.close();
System.out.println("Fluxo de dados desconectado"+info);
if(info!=nulo){
String s[] = info.trim().split(",");
if("Movemouse".equals(s[0].trim()));
{
if (s. comprimento == 3) {
int x = Integer.parseInt(s[1].trim());
int y = Integer.parseInt(s[2].trim());
System.out.println("Saída de informações do mouse"+x+" "+ y);
robot.mouseMove(x, y);
}
}
}
} catch (IOException e) {
System.out.println("Desconectado");
quebrar;
} catch (AWTException e) {
e.printStackTrace();
}
}
}
}
Espero que este artigo seja útil para a programação Java de todos.