📄 maincontroller.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 + -