`
橙色星期五
  • 浏览: 5157 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

TCP/UDP实现远程控制

阅读更多
这里主要应用到的是套接字socket,ServerSocket和机器人Robot
// 初始化服务端的方法
public void initServer() throws IOException {
// 创建服务端套接字对象
ServerSocket server = new ServerSocket(10010);

System.out.println("服务器已经启动,等待连接");

// 等待客户端连接,如果有客户端连接上,会收到客户端套接字
Socket socket = server.accept();
System.out.println("一个客户端连上了"+socket.getRemoteSocketAddress());

// 启动一个线程来给客户端发送服务端桌面
SendThread st = new SendThread(socket);
st.start();

//启动一个线程来接收客户端发来的控制消息
RecieveThread rt = new RecieveThread(socket);
rt.start();



//RecieveThread线程
           Robot robot = new Robot();
         InputStream ips = socket.getInputStream();
         // 接收的是对象流的消息,包装成对象输入流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 收和发的顺序要一致
int x = ois.readInt();
int y = ois.readInt();
int btnNum = ois.readInt();
String type = (String) ois.readObject();
                  int btnMask = InputEvent.BUTTON1_MASK;
if (btnNum == MouseEvent.BUTTON1) {
         btnMask = InputEvent.BUTTON1_MASK;
} else if (btnNum == MouseEvent.BUTTON2) {
btnMask = InputEvent.BUTTON2_MASK;
} else if (btnNum == MouseEvent.BUTTON3) {
btnMask = InputEvent.BUTTON3_MASK;
}

if ("pressed".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mousePress(btnMask);// 按下对应的鼠标按键
           } else if ("released".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mouseRelease(btnMask);
} else if ("moved".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
}




//SendThread线程
//从套接字上获得输出流
OutputStream ops = socket.getOutputStream();
//包装成对象流
ObjectOutputStream oos = new ObjectOutputStream(ops);
// 创建一个机器人对象,用来截屏
Robot robot = new Robot();
         while (true) {
// 获得屏幕的分辨率
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension dim = tool.getScreenSize();
         // 要截取的起始点
Point p = new Point(0, 0);
         // 指定截取的区域
Rectangle rect = new Rectangle(p, dim);
         // 开始截屏,获得截取到的图像
BufferedImage img = robot.createScreenCapture(rect);

//由于BufferedImage没有实现序列化,不能写到IO中
//将BufferedImage包装成可写入IO的图像对象
ImageIcon icon = new ImageIcon(img);
//写出对象
oos.writeObject(icon);
oos.flush();
         try {
          Thread.sleep(1000);
} catch (InterruptedException e) {
          e.printStackTrace();
         }


----------------------------------------------------------------------
客户端部分

初始化客户端界面的方法
public void initUI() {
this.setTitle("远程控制");
this.setSize(800, 600);
this.setResizable(false);
this.setDefaultCloseOperation(3);
// this.setLayout(new BorderLayout());

// 用来显示远程桌面的面板
panel = new JPanel();
JScrollPane jsp = new JScrollPane(panel);
jsp.setPreferredSize(new Dimension(600, 400));
jsp.setAutoscrolls(true);
this.add(jsp, BorderLayout.CENTER);

JPanel tool = new JPanel();
tool.setPreferredSize(new Dimension(600, 50));
this.add(tool, BorderLayout.SOUTH);

JLabel ipLabel = new JLabel("IP:");
ipField = new JTextField("127.0.0.1", 10);
JLabel portLabel = new JLabel("PORT:");
portField = new JTextField("10010",;
JButton btn = new JButton("连接服务器");

tool.add(ipLabel);
tool.add(ipField);
tool.add(portLabel);
tool.add(portField);
tool.add(btn);

this.setVisible(true);

// 给按钮添加监听器
MyListener mlis = new MyListener();
btn.addActionListener(mlis);

// 给面板添加监听器
MyMouseListener mmlis = new MyMouseListener();
panel.addMouseListener(mmlis);
panel.addMouseMotionListener(mmlis);

}

// panel的鼠标监听器
class MyMouseListener implements MouseListener, MouseMotionListener {

public void mousePressed(MouseEvent e) {
// 得到鼠标的位置
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "pressed";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}

}

}

@Override
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "released";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "moved";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}

// 按钮监听器
class MyListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
// 获得Ip@端口
String ip = ipField.getText();
String port = portField.getText();
int intPort = Integer.parseInt(port);

try {
// 创建客户端套接字,连接服务端
Socket socket = new Socket(ip, intPort);

OutputStream ops = socket.getOutputStream();
// 需要发送int,String,要包装成对象流
oos = new ObjectOutputStream(ops);

// 不停的接受服务端发来的图片
RecieveThread rt = new RecieveThread(socket, panel);
rt.start();

} catch (Exception e1) {
// 弹出错误提示框
JOptionPane.showMessageDialog(null, "网络异常,无法连接服务器!");
e1.printStackTrace();





客户端RecieveThread线程
// 从Socket上获得输入流
InputStream ips = socket.getInputStream();
// 由于接受的是对象流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 读取对象,由于发送的是ImageIcon,这里可以强制转型成ImageIcon
Object obj = ois.readObject();
ImageIcon icon = (ImageIcon) obj;
//获得图像大小(即为服务端桌面大小)
int width = icon.getIconWidth();
int height = icon.getIconHeight();
System.out.println(width+"<>"+height);
//修改panel大小为服务端桌面大小
panel.setPreferredSize(new Dimension(width,height));
//获得画布
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0,0, null);
}
分享到:
评论

相关推荐

    虚拟串口转TCP/UDP工具

    虚拟串口转TCP/UDP工具是一种实用的通信软件,它允许用户通过创建虚拟串口来实现串行数据与TCP或UDP网络协议之间的双向转换。在IT行业中,这种工具经常用于设备间的通信,尤其是在需要将传统的串口设备集成到现代...

    tcp/udp调试工具

    在许多情况下,串口通信需要与TCP/IP协议结合,以实现远程控制和数据传输。TCP/IP协议栈可以将串口数据封装成网络数据包,通过网络发送到目标设备,反之亦然。 标签中的"tcpip socket"指的是TCP/IP协议栈中的套接字...

    欧姆龙以太网通讯TCP/UDP例子及欧姆龙PLC程序例子说明

    欧姆龙的编程软件提供了丰富的预定义功能块,方便用户实现TCP/UDP通讯。这些功能块通常具有清晰的中文注释,使得非英语环境下的编程更加直观易懂。例如: 1. TCP_OPEN:建立TCP连接。 2. TCP_SEND:通过已打开的TCP...

    TCP/UDP evc

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的网络通信协议。本文将深入探讨这两种协议,并结合"TCP/UDP evc"的上下文,重点讨论如何在EVC...

    TCP/UDP Socket 调试工具

    这对于远程控制硬件设备或集成网络功能的嵌入式系统特别有用。开发者可以使用这类工具调试网络通信协议,确保串口设备能够正确地与网络环境交互。 总的来说,TCP/UDP Socket调试工具对于理解和优化网络通信过程至关...

    c#屏幕控制广播TCP/UDP

    可能的功能包括但不限于实时屏幕传输、远程控制、键盘鼠标同步等。项目结构清晰,有专门的模块处理屏幕共享、网络通信以及辅助功能。用户通过"ScreenShare.sln"打开项目,然后根据"ReadMe.txt"进行编译和运行,以...

    TCP/UDP服务管理器

    总的来说,TCP/UDP服务管理器是Socket编程中不可或缺的辅助工具,它简化了网络通信测试过程,使得开发者能更专注于应用逻辑的实现,提高开发效率,同时保证了网络通信的可靠性。无论是TCP还是UDP,都能在这款工具的...

    TCP/UDP网络调试工具(9个)

    在IT行业中,网络通信是至关重要的部分,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP提供的是面向连接、可靠的、基于字节流的传输服务,而UDP则是无连接、不可靠的、基于数据报的传输...

    应用程序TCP/UDP察看器

    在信息技术领域,网络通信是核心环节之一,TCP(传输控制协议)与UDP(用户数据报协议)作为互联网上最常用的两种传输层协议,它们的工作机制及状态监测对于系统管理员和开发者来说至关重要。今天我们将深入探讨...

    展厅、展馆视频图片PPT播放器支持TCP/UDP/RS232通信

    它支持TCP/IP协议,这是一种广泛应用于网络通信的标准,通过TCP协议,播放器可以与其他设备进行稳定的数据传输,实现远程控制视频的播放、停止和暂停等功能。同时,UDP协议的引入则提供了更快的数据传输速度,适用于...

    lwipTCP.rar_TCP UDp_lwip tcp _lwipTCP_tcp server_tcp/udp

    TCP(传输控制协议)和UDP(用户数据报协议)是网络通信中的两种主要协议。TCP是一种面向连接的、可靠的协议,它通过三次握手建立连接,并通过序列号、确认应答和重传机制确保数据的可靠传输。而UDP则是无连接的、不...

    检查TCP/UDP连接状态

    TCP(传输控制协议)和UDP(用户数据报协议)是互联网上最常用的两种传输层协议,它们各自具有不同的特点和用途。了解如何检查和管理TCP/UDP连接状态对于优化网络应用性能和解决网络问题至关重要。 首先,TCP是一种...

    tcp/udp数据模拟发送

    在IT行业中,网络通信是至关重要的部分,TCP(传输控制协议)和UDP(用户数据报协议)是两种广泛使用的传输层协议。本话题将详细探讨TCP/UDP数据模拟发送的相关知识,以及如何利用socket编程来实现这一功能。 TCP是...

    tcpviewv TCP/UDP端口信息

    TCPView可以帮助用户查看当前系统中所有活跃的TCP和UDP连接,包括连接的端口号、进程ID、远程IP地址以及状态等详细信息。 标题“tcpviewv TCP/UDP端口信息”表明,这款工具主要功能是展示关于TCP和UDP端口的实时...

    TCP/UDP数据收发参考代码

    在IT行业中,网络通信是至关重要的一个领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的数据传输协议。本篇将基于标题"TCP/UDP数据收发参考代码"和描述,结合标签"TCP UDP linux",详细讲解这两个...

    单通道视频融合 支持局域网网络Socket TCP UDP播控指令

    软件本身无任何控制按钮,所有播放控制均能过网络SOCKET TCP和UDP协议控制,控制指令包括:播放,暂停,停止,静音,音量加,音量减,视频切换等。软件包内附带控制端演示程序一套。 融合调整方法:在软件启动后5秒...

    TCP/UDP测试工具

    在数据传输过程中,TCP会进行流量控制和拥塞避免,确保数据的有序、完整传输,而且它还具有重传机制,如果数据包丢失,TCP会自动重发。因此,TCP常用于需要高可靠性的应用,如HTTP、HTTPS、FTP、SMTP等。 相比之下...

    串口和tcp/ip调试助手

    这样的工具可以帮助开发者将串口设备接入到TCP/IP网络中,实现串口设备与网络设备之间的数据交换,这对于远程监控和控制串口设备非常有用。在实际应用中,例如工业自动化、物联网设备的开发等,这类工具是非常关键的...

Global site tag (gtag.js) - Google Analytics