java学习第二十五天之模拟服务器、反射、使用URL对象
来源:互联网 发布:防小三软件 编辑:程序博客网 时间:2024/04/28 15:48
常见的客户端和服务端有哪些呢?客户端:浏览器服务端:Tomcat如果请求图片的网页,请求的次数很多,有多少资源html文件,图片文件,css文件,js文件;就需要请求多少次浏览器中当然也是内容如socket一样的客户端程序用java模拟:Socket socket=new Socket("192.168.12.135",8080);可是浏览器到底向服务器发送了什么样的请求呢?怎么验证?将tomacat服务器换掉。自定义一个服务器接收浏览器发送的数据这样就知道浏览器发送的是什么1、自定义服务器浏览器给服务器发送的信息如下: 192.168.1.136...connected GET / HTTP/1.1 //请求方式//请求的路径//http的协议版本 //http协议的请求头消息 //请求消息中的属性信息 Host: 192.168.1.136:9090 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36//用户代理接受的平台 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8//接收的解析文件的格式 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8//支持的语言 空格模拟浏览器获取网页信息网络架构两种: C/S client server 特点: 1、客户端和服务器都需要编写 2、客户端需要维护 3、客户端可以分担部分运算如果 大型运算,比如网络游戏 B/S brower server 特点: 1、只需要编写服务端,客户端其实就是已有的服务器 2、客户端不需要维护的 3、预算全在服务器端
模拟服务器
package cn.network.demo;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class MYBrowser { /** * @param args * 模拟浏览器,发送一些http的消息给tomcat服务器,并获取服务器反馈的信息 * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket socket=new Socket("192.168.1.136", 18080);// 获取输出流,给服务器发送数据 PrintWriter out=new PrintWriter(socket.getOutputStream(),true); out.println("GET /lala/hello.html HTTP/1.1"); out.println("Accept: */*"); out.println("Host: 192.168.1.136:9090"); out.println("Connection: close");//keep-alive,服务器会一直等着发数据,close发送一次就停止了// out.println("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");// out.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");// out.println("Accept-Encoding: gzip, deflate, sdch");// out.println("Accept-Language: zh-CN,zh;q=0.8"); out.println(); InputStream in=socket.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf); String strs=new String(buf, 0, len); System.out.println(strs); socket.close(); }}
反射
package cn.network.demo;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;public class RelectDemo2 { /** * @param args * 演示如何根据给定名称取到指定的class对象后建立该类的对象呢? * @throws Exception */ public static void main(String[] args) throws Exception {// getObjectDemo1(); getObjectDemo2(); } /** * @throws ClassNotFoundException * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InstantiationException * */ private static void getObjectDemo2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { /* 万一给定类中没有空参数呢? 可以先获取指定的构造函数,再通过该构造函数进行实例化 通过Class获取指定 构造函数,比如带两个参数 */ String className="cn.network.demo.Person"; Class class1=Class.forName(className); Constructor constructor=class1.getConstructor(String.class,int.class);//参数传递的是类型对象 System.out.println(constructor); Object object=constructor.newInstance("李四",46); } /** * @throws ClassNotFoundException * @throws ReflectiveOperationException * @throws InstantiationException * @throws Exception * @throws NoSuchMethodException * */ private static void getObjectDemo1() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, Exception { String className="cn.network.demo.Person"; Class class1=Class.forName(className); Object object=class1.newInstance();//创建一个Person对象默认的调用该类的空参数构造函数 //记住了,一般被反射的类通常都有空参数的构造函数 }}
package cn.network.demo;public class ReflectDemo { /** * @param args * 反射技术:动态的获取类以及类中的成员,并可以调用该类成员 * 以前是有什么类,就new什么对象。没有类,给什么类就创建什么对象 * * 无论new什么对象,都需要先获取字节码文件 * 如何获取呢?发现java已对字节码文件进行了描述用的class类完成的 * * 如何获取一个字节码文件的对象呢? * 方式一: Object getClass()方法 * * 方式二:所有的数据类型都有自己对对应的class对象。表示方式很简单 * 每一个数据类型都有一个默认的静态的属性。.class 用该属性就可以获取到自字节码文件对象 * 虽然不用对象调用了,还是要用到具体的类调用静态属性 * * 方式三:在Class类中找到了forName方法,通过名称就可以获取对应的字节码文件对象 * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException {// methodDemo_1();// methodDemo_2(); methodDemo_3(); }/** * @throws ClassNotFoundException * */ private static void methodDemo_3() throws ClassNotFoundException { String className="cn.network.demo.Person";//一定要传对类名,要完整版! Class class1=Class.forName(className); System.out.println(class1); }/** * */ private static void methodDemo_2() { Class class1=Person.class;// int.class Class class2=Person.class; System.out.println(class1==class2); }// 获取class独享的方式一 public static void methodDemo_1() {// 调用getclass先有对象 Person person1=new Person(); Person person2=new Person(); Class class1=person1.getClass(); Class class2=person2.getClass(); System.out.println(class1); System.out.println(class1==class2);//两个类相同 }}
package cn.network.demo;import java.lang.reflect.Field;public class ReflectFieldDemo { /** * @param args * 获取类中的成员 * 反射字段 * @throws ClassNotFoundException * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws Exception { getField(); } /** * @throws ClassNotFoundException * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws InstantiationException * */ private static void getField() throws Exception { String className="cn.network.demo.Person"; Class class1=Class.forName(className); //获取age字段 Field field1=class1.getField("age");//只能拿到公有的 Field field2=class1.getDeclaredField("name");//能拿到公有和私有的,但是不包括继承的 System.out.println(field1); System.out.println(field2);// 要对非静态的字段操作必须有对象 Object object=class1.newInstance();// 使用父类的方法将访问权限检查能力取消 field2.setAccessible(true);//暴力访问 field2.set(object, "小王"); System.out.println(field2.get(object)); }}
package cn.network.demo;import java.lang.reflect.Method;public class ReflectMethodDemo { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception {// getMethodDemo(); getMethodDemo2(); getMethodDemo3(); } /** * */ private static void getMethodDemo3() throws Exception{ String className="cn.network.demo.Person"; Class class1=Class.forName(className); Method method=class1.getMethod("paramShow", String.class,int.class); Object object=class1.newInstance(); method.invoke(object,"张三",30); } /** * 反射方法,静态,无参数的show方法 */ private static void getMethodDemo2() throws Exception{ String className="cn.network.demo.Person"; Class class1=Class.forName(className); Method method=class1.getMethod("staticShow", null); method.invoke(null, null); } /** * @throws Exception * */ private static void getMethodDemo() throws Exception { String className="cn.network.demo.Person"; Class class1=Class.forName(className);// 反射方法 非静态,无参数的show方法 Method method=class1.getMethod("show", null); Object object=class1.newInstance(); method.invoke(object, null); }}
使用URL对象
package cn.network.demo;import java.io.IOException;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class URLDemo { /** * @param args * 解析URL中放入数据,使用URL对象 * @throws IOException */ public static void main(String[] args) throws IOException { String str_url="http://192.168.1.136:8080/lala/hello.html?name=lili"; URL url=new URL(str_url); System.out.println(":"+url.getProtocol()); System.out.println(":"+url.getHost()); System.out.println(":"+url.getPort()); System.out.println(":"+url.getPath()); System.out.println(":"+url.getFile()); System.out.println(":"+url.getQuery());// 通过openconnection()获取到远程资源的连接对象 URLConnection connection=url.openConnection(); System.out.println(connection); System.out.println("-----------------");// 调取连接对象的读取烦烦烦,准备读取资源 InputStream in=connection.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf); String strs=new String(buf, 0, len); System.out.println(strs); }}
反射调用
package cn.network.demo;public interface USB{ /** * 定义打开 */ void open(); /** * 定义关闭 */ void close();}
package cn.network.demo;public class MouseByUSB implements USB { @Override public void open() { System.out.println("mouse open"); } /* (non-Javadoc) * @see cn.network.demo.USB#close() */ @Override public void close() { System.out.println("mouse close"); }}
package cn.network.demo;public class NoteBook { public void run() { System.out.println("notebook run!"); } /** * 使用USB设备 */ public void useUSB(USB usb) { if(usb!=null){ usb.open(); usb.close(); } }}
package cn.network.demo;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class NoteBookMain { /** * @param args * @throws IOException * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { NoteBook book=new NoteBook(); book.run(); book.useUSB(null); /* 因为有了鼠标,所以需要在源程序中。创建鼠标对象并传到笔记本 希望后期出现了设备以后,可不可以不用修改NoteMain的代码,还可以不断地加入新的设备 book.useUSB(new MouseByUSB()); */// 对外提供配置文件 File configFile=new File("usb.properties"); if(!configFile.exists()){ configFile.createNewFile(); }// 读取流和配置文件关联 FileInputStream inputStream=new FileInputStream(configFile); Properties properties=new Properties();// 将流中的数据加载到properties properties.load(inputStream); for (int i = 0; i < properties.size(); i++) { String className=properties.getProperty("usb"+i);// 对指定的类进行加载 Class class1=Class.forName(className); USB usb=(USB) class1.newInstance(); book.useUSB(usb); } }}
package cn.network.demo;public class Person { private String name; public int age; /*public Person() { super(); System.out.println("I'm person."); }*/ public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println("Person show run!"); } public static void staticShow() { System.out.println("staticShow run!"); } public static void paramShow(String name,int age) { System.out.println("show"+name+"-----"+age); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; }}
0 0
- java学习第二十五天之模拟服务器、反射、使用URL对象
- 第二十五天学习笔记
- Java学习总结第二十五天java.lang包(二)
- 黑马程序员--Java基础学习(正则表达式)第二十五天
- Java基础学习第二十五天——设计模式
- python第二十五天学习记录
- python爬虫学习第二十五天
- JAVA 攻城狮 第二十五天
- java基础第二十五天 数据库
- 第二十五天
- java的URL类使用和模拟POST请求服务器
- 黑马程序员--- 学习笔记(第二十五天)
- 传智博客JAVA基础第二十五天
- Java基础学习第二十五天——多线程学习总结(二)
- Java学习 之 获取Class对象、使用反射生成并操作对象
- Java学习第五天:面向对象
- java学习第二十八天之XML解析
- 使用反射和注解简单模拟服务器
- svn 冲突解决 Decide how to resolve conflict on xxxx.java
- 牛顿法
- Mysql 指令创建数据库
- Elasticsearch 5.3.0 离线安装
- 【经典】C语言字符串函数原型
- java学习第二十五天之模拟服务器、反射、使用URL对象
- PHPmyadmin漏洞和拿shell
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- 基于Spark 2.0.0搭建Hive on Spark环境
- 密码脱落
- Linux open(), close()
- pl/sql报错:Identifier is too long
- EXCEL排序 HDU
- 正方形(squares,UVa201)