服务端通过socket向安卓客户端发送shell
目的:服务端能够触发客户端去执行一些操作,例如自动化,清app数据,获取手机信息等操作
服务端-socket-客户端-shell-result-http/socket-服务端
1.客户端权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.连接服务端socket
// 获得一个Socket通道
SocketChannel channel = SocketChannel.open();
// 设置通道为非阻塞
channel.configureBlocking(false);
// 获得一个通道管理器
this.selector = Selector.open();
// 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调
//用channel.finishConnect();才能完成连接
channel.connect(new InetSocketAddress(hostIp, hostListenningPort));
//将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。
channel.register(selector, SelectionKey.OP_CONNECT);
3.接受到后 dosomething 后再回传给服务端
channel1 = SocketChannel.open();
// 设置通道为非阻塞
channel1.configureBlocking(false);
// 获得一个通道管理器
this.selector = Selector.open();
// 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调
//用channel.finishConnect();才能完成连接
channel1.connect(new InetSocketAddress(hostIp, hostListenningPort));
//将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。
channel1.register(selector, SelectionKey.OP_CONNECT);
// 轮询访问selector
while (true) {
selector.select();//如果队列有新的Channel加入,那么Selector.select()会被唤醒
// 获得selector中选中的项的迭代器
Iterator ite = this.selector.selectedKeys().iterator();
while (ite.hasNext()) {
SelectionKey key = (SelectionKey) ite.next();
// 删除已选的key,以防重复处理
ite.remove();
// 连接事件发生
if (key.isConnectable()) {
SocketChannel channel = (SocketChannel) key.channel();
// 如果正在连接,则完成连接
if (channel.isConnectionPending()) {
channel.finishConnect();
}
// 设置成非阻塞
channel.configureBlocking(false);
//在这里可以给服务端发送信息
channel.write(ByteBuffer.wrap(new String(imei).getBytes()));
//在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。
channel.register(this.selector, SelectionKey.OP_READ );
} else if (key.isReadable()) {
read(key);//do something
}
}
}