⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maincontroller.java

📁 简单的java程序 自己看啊有问题留言
💻 JAVA
字号:
package org.jstudio.tools.pcanywhere;

import java.io.*;
import java.net.*;
import java.awt.event.InputEvent;

/**
 * <p>Title: 主控端</p>
 *

 */
public class MainController {

    /*-连接被控端-*/
    public static ControlledStatus Connect(InetAddress inet) throws Exception{
        ControlledStatus status = null;
        ServerSocket server = openNewPort();
        Socket socket = null ;
        try {
            server.setSoTimeout(Environment.TCP_TIME_OUT); //设置超时
            sendCommand(inet, CommandHandle.toCommand(CommandHandle.Command_Connection, server.getLocalPort()));
            socket = server.accept(); //开启
            ObjectInputStream read = new ObjectInputStream(socket.getInputStream()); //封装流,准备读取一个对象
            Object obj = read.readObject();
            if (obj != null) {
                status = (ControlledStatus) obj;
                status.setControlled(inet);
            }
            else {
                throw new IOException("连接失败:\n  目标机器不可达");
            }
        }
        catch (IOException e) {
            throw new Exception("连接失败:\n  目标机器不可达");
        }
        finally {
            try {
                if (socket != null)
                    socket.close();
                server.close();
            }
            catch (IOException e) {
            }
        }
        return status;
    }

    /*-断开被控端-*/
    public static void Disconnect(InetAddress inet){
        try{
            sendCommand(inet, CommandHandle.toCommand(CommandHandle.Command_Disconnection, ""));
        }catch(IOException e){}
    }

    /**
     * 开启主控端一个可用随机端口的ServerSocket
     * @return ServerSocket
     * @throws Exception
     */
    public static ServerSocket openNewPort()throws IOException{
        ServerSocket socket = null;
        boolean sucess = true;
        int count=0;
        while(sucess){
            count++;
            //尝试10次,连接不成功就放弃
            if(count>=10)throw new IOException("连接失败,无法开启本机器端口.");
            int c=(int)(Math.random()*10000);
            int port=(int)(c-65530*(c/65530));

            try {
                socket = new ServerSocket(port);
                sucess = false;
            }
            catch (IOException e) {
                continue ;
            }
        }
        return socket ;
    }

    /*-向被控端发送指令-*/
    public static void sendCommand(InetAddress inet,String command)throws IOException{
        byte sp[] = command.getBytes();
        DatagramPacket packet = new DatagramPacket(sp, sp.length, inet, Environment.UDP_PORT);
        try {
            DatagramSocket sd = new DatagramSocket();
            sd.send(packet);
        }
        catch (Exception e) {
            throw new IOException("向被控端请求失败!");
        }
    }

    /**
     * 开启获取被控端屏幕的监听线程
     * @param clientstatus ClientStatus
     * @throws Exception
     */
    public static void startClientScreen(ControlledStatus clientstatus,MainFrame frame) throws Exception{
        ServerSocket server = openNewPort();
        server.setSoTimeout(Environment.TCP_TIME_OUT);//设置超时

        sendCommand(clientstatus.getControlled(),
                    CommandHandle.toCommand(CommandHandle.Command_Screen,server.getLocalPort()));

        Socket socket=server.accept();
        System.out.println(socket.getRemoteSocketAddress()+" 已经连接端口:"+socket.getLocalPort()+" 等待进行图形传送");

        //new ImageReceiveThread(socket,frame).start();//启动图象显示线程,更新图像

        Class[] argTypes = new Class[]{Socket.class,MainFrame.class};
        Object[] args = new Object[]{socket,frame};
        ThreadManager.start(ImageReceiveThread.class,argTypes,args);

    }

    /*-开启控制socket-*/
    public static MainControlSocket startControlSocket(ControlledStatus clientstatus)throws IOException{
        MainControlSocket control = null ;
        try {
            ServerSocket server = openNewPort();
            server.setSoTimeout(Environment.TCP_TIME_OUT);//设置超时

            sendCommand(clientstatus.getControlled(),
                    CommandHandle.toCommand(CommandHandle.Command_Control,server.getLocalPort()));

            Socket socket=server.accept();
            System.out.println(socket.getRemoteSocketAddress()+" 已经连接端口:"+socket.getLocalPort()+" 控制套接开启");

            control = new MainControlSocket(socket);
        }
        catch (IOException e) {
            throw new IOException("网络故障");
        }
        return control ;
    }
}

class MainControlSocket {

    private Socket socket = null;
    private ObjectOutputStream out = null; //事件对象发送封装

    public MainControlSocket(Socket socket) throws IOException {
        this.socket = socket;
        this.socket.setSendBufferSize(Environment.EVENT_CACHE);
        out = new ObjectOutputStream(socket.getOutputStream());
    }

    /*
     * 发送事件
     */
    public void sendControlledAction(InputEvent event) {
        try {
            out.writeObject(event);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void close(){
        try {
            if(out!=null){
                out.close();
                out = null ;
            }
            if(socket!=null){
                socket.close();
                socket = null ;
            }
        }
        catch (IOException e) {
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -