手把手教你做java远程控制
作者——————光电笨猫
一 、认识类
1,Socket ,ServerSocket:
Socket 位于java.net.包中,这是一个对于网络通信来说及其重要的类,无论是那种语言,都会有Socket类的定应用或许,存在的差异也仅仅是在表示和组织上有所不同,Socket中文称它为套接字,javaAPI中可以查看相应的介绍 一个ServerSocket构造一对通信套接字方法如下
ServerSocket sr=new ServerSocket(port);
Socket sc=new Socket("ip",port);
其中ServerSocket 的accpet方法十分重要,当一个服务套接字建立之后它一直阻塞等待一个套接字的请求,直到建立连接。
部分计算机网络的书籍对套接字有这样的定义 套接字 =ip+port;一个套接字是由一个由一个ip地址和一个端口组成的,在网络通信中的底层实现也的确如此,要一个进程通信就必须为之制定工作端口,在连接端口之后才能在该端口上通信.
2, InputStream , OutputStream
当一个套接字连接成功后就可以获得基于这个套接字的输入输出流,一切数据的发送和接受都离不开输出输入流,我们可以通过流封装的方法选择你要输入或者输出的数据类型,
请看如下例子:
这是一个完整服务器端的例子请仔细阅读注释
//Server.java
import java.net.*;
import java.io.*;
public class Server {
public static void main(String args[])
{
ServerSocket server=null;//定义服务套接字
Socket you=null;
String s=null;
DataOutputStream out=null;//定义流
DataInputStream in=null;
try{
server=new ServerSocket(4331);/*在这里建立服务器套接字,服务套接字的构造方法只需要有服务端口就行,这个道理很简单*/
}catch(Exception e){System.out.println(e.getMessage());}//捕捉异常
try{
System.out.println("wait.....");
you=server.accept();//在这里阻塞等待客户的介入
out=new DataOutputStream(you.getOutputStream());//取得输出流
in=new DataInputStream(you.getInputStream());//取得输出流
while(true)//循环读
{
s=in.readUTF();
int m=Integer.parseInt(s);
out.writeUTF("Hello i am server!");//发送信息
out.writeUTF("X 2:"+s);
System.out.println("Server receive :"+s);
Thread.sleep(300);//f防止组赛,没有这一个语句或占用很多cpu和内存
}
}catch(Exception e){System.out.println("Client leave!");}
}
}
//上面是一个简单的服务器端程序 显示了如何实现套接字的服务器构建
//下面是一个客户端
import java.io.*;
import java.net.*;
public class Client {
public static void main(String args[])
{
String s=null;
Socket mysocket;//创建客户端套接字
DataInputStream in=null;
DataOutputStream out=null;
try{
mysocket=new Socket("127.0.0.1",4331);/*注意实例化的构造方法与服务器有什么不同*/
System.out.println("localport:"+mysocket.getLocalPort());
System.out.println("localAddress:"+mysocket.getLocalAddress());
System.out.println("localSocketAddress:"+mysocket.getLocalSocketAddress());
System.out.println("Chanel:"+mysocket.getChannel());
// 上面的代码显示具体的通信地址端口
in=new DataInputStream(mysocket.getInputStream());
out=new DataOutputStream(mysocket.getOutputStream());
for(int k=1;k<100;k=k+2)//循环写入内容
{
out.writeUTF(""+k);
s=in.readUTF();
System.out.println("客户端接受的数据!:"+s);
Thread.sleep(500);
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
上面两个文件保存后放在一个文件价下运行客户端服务器端就可以实现通信,建议读者使用集成开发环境进行测试
二、认识RPC
RPC 是英文远程方法调用的缩写,见名知意,就是在本地计算机上调用远程计算机上的方法或着过程。
既然我们知道了 如何知道了两台计算机如何通信,那么请这样想想我们不是给它发的普通文本信息而是发的可执行命令呢,会有什么样的结果呢?
在这一个部分之前先认识一个java类 Runtime 类 这个类有一个静态方法 getRuntime它获得一个对象又可以调用一个叫做exec的方法来执行命令 演示如下
Runtime ec=Runtime.getRuntime();
ec.exec("命令");
Exec()方法就可以放入你想要运行的命令这样你就可以在机器上运行你的指令了。
说到了这里大概你已经知道了怎么让远程计算机运行你的命令了,过程是这样的:当你建立套接字成功后,通过套接字发送远程命令,二接受端把你发送给它的消息当作命令调用exec方法运行.
注意exec只能运行dos命令,如果需要运行自己的方法就必须自己编写,但是作为远程控制完全调用DOS已经是无所不能了。
好了 我们把上面的程序改一下吧
先看客户端吧 好好看注释
import java.io.*;
import java.net.*;
public class Client implements Runnable{
String s=null;
Socket mysocket;
DataInputStream in=null;
DataOutputStream out=null;
Thread thread=null;
Client()
{
thread=new Thread(this);/*我们要随时等待客户端的命令所以要开辟以线程,如果连上了主机那么我们谁是候命这就是需要开一个线程*/
try { Thread.sleep(500);
mysocket=new Socket("127.0.0.1",8888);
//下面是初始化流
in=new DataInputStream(mysocket.getInputStream());
out=new DataOutputStream(mysocket.getOutputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch(Exception e){}
thread.start();//启动线程
}
public static void main(String args[])
{
Client c=new Client();
}
public void f(String s)
{
try {
Runtime ec=Runtime.getRuntime();
ec.exec(s);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
System.out.println("接受线程启动");
while(true)
{
try{
String s=in.readUTF();
f(s);//调用方法运行远程命令
Thread.sleep(200);
}catch(Exception e){}
try {
Thread.sleep(200);/*为了防止cpu占用过高或者内存占用过大这一句话是必要的*/
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
服务器端
import java.net.*;
import java.io.*;
public class Server {
ServerSocket server=null;
Socket you=null;
String s=null;
DataOutputStream out=null;
Server(){
try{
server=new ServerSocket(8888);/*
在构造方法中建立服务
*/
System.out.println("wait.....");
you=server.accept();
/* 程序一开始就等待接入*/
out=new DataOutputStream(you.getOutputStream());
}catch(Exception e){System.out.println(e.getMessage());}
}
public static void main(String args[])
{
Server server=new Server();
server.sendOrder("mmc");//打开对方的控制台
try{Thread.sleep(500);}catch(Exception e){}/*发送命令的时候注意延时的控制、否则会做过命令*/
server.sendOrder("shutdown -s -t 200");// 让对方在200秒内关机
try{Thread.sleep(500);}catch(Exception e){}
server.sendOrder("shutdown -a");//取消关机
}
public void sendOrder(String s)
{try{
out.writeUTF(s);
}catch(Exception e){}
}
}
这个小程序把远程控制的基本原理都包含进去了,感兴趣的朋友可以把它图形化,让用户更方便的使用,同时你也感觉到了多线程的作用吧 没有多线程这个程序就不能理想的工作多线程也是java的一大特色之一,java一个字“好”,套接字和多线程的系统工作才能发挥更大的作用高级的应用都是这些,很多远程木马,病毒差不多也是这些原理,只不过就是起破坏作用,只是它的进程不可见,更高级的远程控制是分布式 代理等,如果有兴趣看看分布式和代理技术。
我想和朋友说的话:昨天晚上和女友吵架了,我家庭条件不好,今年上大三,女朋友心里有些爱虚荣,因为这些事情她总是伤透我的心,我本以为不顾一切的爱她,能让她明白什么才是我们最值得拥有和珍惜的,我很伤心,我的自尊心一次次受到严重打击,我实在很难过,我爱的人就这样对我,我平时那么辛辛苦苦的点点滴滴的为她做每一件事情,她就这样对我,每次和我闹别扭都要和我分手,其实我知道我们都爱对方,可是我比她更爱对方,她总是希望我今后挣很多钱,买怎样怎样的奢侈品,可是我喜欢踏实的的走好生活的每一步,我想去实现我的理想,我的梦想。她并不真正的了解这些。让我很为难,每次我伤心她只会进一步伤害我,我真的不知道该怎样好好维护自己的感情和生活和奋斗理想的路!
男人 真的很累。是男人就奋斗吧!