JAVA控制窗口无法键盘输入,JAVA远程控制简单实现以及键盘事件无法发送的问题解决...

最近想重温下Socket网络编程,太久没写了都快整忘记咯。

于是决定写个远程控制的软件吧。

我看了一下网上的版本,大概的思路是:分为客户端(被控制端)和服务器端(控制端)

被控制端(以下简称C端),主要做的是把自己屏幕截图,通过socket发送出去。

同时接收从服务器端发来的鼠标键盘操作,通过Robot类来实现键鼠模拟操作。

服务器端(以下简称S端),主要是接收客户端发过来的截图并通过Swing界面显示出来

同时,在界面上进行键盘鼠标操作时,将键盘鼠标命令通过Socket发送给C端。

借鉴一下大佬的代码 java实现远程控制应用,代码只需要稍微修改一下便可以运行,但是发现,S端的鼠标操作,能在C端正常模拟运行,但是S端的键盘操作,是不能通过Socket发送的,报java.io.NotSerializableException: java.io.ObjectOutputStream异常,很奇怪的是,鼠标事件和键盘事件,都是使用ObjectOutputStream来发送InputEvent对象,咋就发不出呢?然后网上一搜,果然也有人遇到这个问题:Socket无法发送按键事件,源代码中,KeyEvent是继承了EventObject,实现了序列化的,但是为什么还是报未序列化错误。这个我确实不懂,问了几个大佬,也说不出为啥,希望有大佬看到这个问题能稍微教教小弟。既然KeyEvent实现不了,那就自己定义一个实体类,序列化之后S端发送就行了,在C端进行解析。附上相关代码:

实体类

public class serEvent implements Serializable{

static final long serialVersionUID = 1L;

int keyCode;

int id;

get和set方法,带参以及不带参的构造函数

}

S端,键盘按下时操作,新建一个serEvent,通过ObjectOutputStream发送

@Override

public void keyPressed(KeyEvent arg0) {

serEvent e1=new serEvent(arg0.getID(),arg0.getKeyCode());

try {

ous.writeObject(e1);

ous.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

C端,收到事件之后,判断是鼠标还是键盘事件

Object eventobj = objins.readObject();

try {

InputEvent e = (InputEvent) eventobj;

actionEvent(e);

}catch (Exception e) {

//说明是按键事件!

serEvent e1 =(serEvent) eventobj;

actionKeyEvent(e1);

}

利用Robot去实现模拟操作

if(e.getId()==KeyEvent.KEY_PRESSED){

robot.keyPress(e.getKeyCode());

}

if(e.getId()==KeyEvent.KEY_RELEASED){

robot.keyRelease(e.getKeyCode());

}

最后成功解决键盘事件无法发送的问题。

至此,局域网内的控制端和服务器端代码已成功运行。

但是,如果想像TeamViewer或者QQ那样实现远程控制,就必须使用云服务来进行中转。

所以又在原来基础上做了个服务器中转版本。所以现在就有3个端,一个S控制端,一个C被控端,一个W网络服务器端。

代码开新帖贴上去吧。云服务器中转的远程控制JAVA代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值