java简单的通过反射远程 让服务器执行内容(叠叠学习)

两个类:一个客户端类,像安卓手机啊。AndroidClient 类

                一个服务器类,像linux服务器,LinuxService类

                作用:手机通过网络发送信息,服务器识别后,执行相应代码,在服务器控制台输出信息。

模拟:手机端代码

package Javafanse;
import java.io.*;
import java.net.*;
public class AndroidClient {
    public void send() throws Exception {
        Socket socket = new Socket("127.0.0.1", 18080);
        //套接字获得输出流
        OutputStream out = socket.getOutputStream();
        byte[] bytes="Hailer".getBytes();//由于我知道服务器的一个类是Hailer 所以我就直接写了,把它字符转字节放如 byte数组里面
        //然后放入输出流 传输
        out.write(bytes);
        //关闭Socket 释放资源
        socket.close();
    }

    public static void main(String args[]) throws Exception {
        new AndroidClient().send();
    }
}

服务器端代码:

package Javafanse;

import java.io.*;
import java.net.*;
import java.lang.reflect.*;

public class LinuxServer {
    public static void service() throws Exception {
        ServerSocket serverSocket = new ServerSocket(18080);
        System.out.println("服务器启动.");
        //无限循环 等待来自客服端的请求

        while (true) {
            Socket socket = serverSocket.accept();//来一个客户 创建对应一个 Socket对象

            InputStream in = socket.getInputStream();//接受来自Socket的信息
            byte[] bytes = new byte[6];//因为我知道Hailer 是6个字节(1个字母字符,一个字节就可以表示了),就创建了 6个大小的buyte数组
            in.read(bytes);//把客户发来的字节流 放入bytes数字
            //new String(bytes)作用是 把bytes的字节 转为字符串
            Class cls=Class.forName("Javafanse."+new String(bytes));//Class.forName方法是 获的一个类的名字是 该字符串 的  一个Class 实例


            Method method=cls.getMethod("say");//因为我知道方法名字是say
            // 不知道的时候需要通过反射 获取方法 是什么修饰的, 方法名是啥 ,因为麻烦,我就不写了

            //下面通过反射调用方法,在服务器的控制台 输出hello
            method.invoke(new Hailer());//因为我知道调用的方法是Hailer对象的,最简单就是new了,但是也可以通过反射获得
            //cls.getDeclaredConstructor().newInstance();  这个代码放在上面括号就是通过反射获取Hailer对象.
            socket.close();
        }
    }

    public static void main(String args[]) throws Exception {
        service();
    }
}

class Hailer{
    public String say(){
        System.out.println("客户通过网络发送了信息,服务器通过反射执行了方法,在服务器的控制台 输出:hello");
        return null;
    }
}

 由于怕写得太复杂,而看不懂,尽力减少代码了

可以思考,可以实现更复杂,更强大的内容

比如,可以让服务器 根据客户端 发来的数据做操作后,把结果再给客户。        

               或者,客户 通过网络 控制服务器,做任何事,前提服务器代码设定好了,等待

还有,这里的网络地址用的是本机回环地址,测试用的,实际在互联网上,是要公网ip,你们自行该ip就好了。

注意是服务器是运行的噢,就是java代码已经是跑起来了,反射真强大

执行结果

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值