两个类:一个客户端类,像安卓手机啊。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代码已经是跑起来了,反射真强大
执行结果