本帖最后由 小石姐姐 于 2018-4-26 14:13 编辑
通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互联协议),它是一个包括TCP协议和IP协议,UDP(User Datagram Protocol)协议和其它一些协议的协议组,在学习具体协议之前首先了解一下TCP/IP协议组的层次结构。 在进行数据传输时,要求发送的数据与收到的数据完全一样,这时,就需要在原有的数据上添加很多信息,以保证数据在传输过程中数据格式完全一致。 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。 要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机或者发送数据的计算机。 在TCP/IP协议中,这个标识号就是IP地址,它可以唯一标识一台计算机,目前,IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示,如:00001010000000000000000000000001。由于二进制形式表示的IP地址非常不便记忆和处理,因此通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开,如 “192.168.1.100”。 随着计算机网络规模的不断扩大,对IP地址的需求也越来越多,IPV4这种用4个字节表示的IP地址面临枯竭,因此IPv6 便应运而生了,IPv6使用16个字节表示IP地址,它所拥有的地址容量约是IPv4的8×1028倍,达到2128个(算上全零的),这样就解决了网络地址资源数量不够的问题。 通过IP地址可以连接到指定计算机,但如果想访问目标计算机中的某个应用程序,还需要指定端口号。在计算机中,不同的应用程序是通过端口号区分的。端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用,用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用。
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
前面介绍了UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。 想要创建一个DatagramPacket对象,首先需要了解一下它的构造方法。在创建发送端和接收端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。 接下来根据API文档的内容,对DatagramPacket的构造方法进行逐一详细地讲解。 使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(ip地址和端口号),而接收端不需要明确知道数据的来源,只需要接收到数据即可。
使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。
DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示。 在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同,下面对DatagramSocket类中常用的构造方法进行讲解。
该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号。
该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口。 TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。 区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。 而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。 在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。 通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。 通过前面的学习知道,在开发TCP程序时,首先需要创建服务器端程序。JDK的java.net包中提供了一个ServerSocket类,该类的实例对象可以实现一个服务器段的程序。通过查阅API文档可知,ServerSocket类提供了多种构造方法,接下来就对ServerSocket的构造方法进行逐一地讲解。
使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上(参数port就是端口号)。
ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。 讲解了ServerSocket对象可以实现服务端程序,但只实现服务器端程序还不能完成通信,此时还需要一个客户端程序与之交互,为此JDK提供了一个Socket类,用于实现TCP客户端程序。 通过查阅API文档可知Socket类同样提供了多种构造方法,接下来就对Socket的常用构造方法进行详细讲解。 使用该构造方法在创建Socket对象时,会根据参数去连接在指定地址和端口上运行的服务器程序,其中参数host接收的是一个字符串类型的IP地址。 该方法在使用上与第二个构造方法类似,参数address用于接收一个InetAddress类型的对象,该对象用于封装一个IP地址。 在以上Socket的构造方法中,最常用的是第一个构造方法。
在Socket类的常用方法中,getInputStream()和getOutStream()方法分别用于获取输入流和输出流。当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用它的任意一个方法
这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制.
简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖.
通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有。 通过反射运行public变量流程 1. 通过反射获取该类的字节码对象 Class clazz = Class.forName("com.heima.Person"); 2. 创建该类对象 Object p = clazz.newInstance(); 3. 获取该类中需要操作的字段(成员变量) getField(String name) --> 方法传入字段的名称. 注意: 此方法只能获取公共的字段 Field f = clazz.getField("age"); 4. 通过字段对象中的方法修改属性值 void set(Object obj, Object value) --> 参数1): 要修改那个对象中的字段, 参数2): 将字段修改为什么值. f.set(p, 23); Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
void setAccessible(boolean flag) --> 让jvm不检查权限 // 获取字节码对象 Class clazz = Class.forName("com.heima.Student"); // 创建学生对象 Object stu = clazz.newInstance(); // 暴力反射获取方法 Method method = clazz.getDeclaredMethod("method"); // 让jvm不检查权限 method.setAccessible(true); // 执行方法 method.invoke(stu); 将需要操作的多个属性封装成JavaBean, 简单来说就是用于封装数据的 规范: 类使用公共进行修饰 提供私有修饰的成员变量 为成员变量提供公共getter和setter方法 提供公共无参的构造 之前我们使用的类都是来自Java编写好的源代码 而这个BeanUtils却是一个叫做Apache的组织编写. 那么这个组织编写的代码当中, 有一个系列可以很方便的提高我们今后的开发效率. 这个系列为Commons, BeanUtils就是其中之一 static void setProperty(Object bean, String name, Object value)
static String getProperty(Object bean, String name)
static void populate(Object bean, Map properties) public static void setProperty(Object bean,String name,Object value) // 设置任意对象的, 任意属性, 为任意的值 public static String getProperty(Object bean,String name) // 获取任意对象的任意属性 public static void populate(Object bean,Map map) // 修改任意对象中的属性, 为传入Map集合中的键和值 HTML的表格标签 <table> <tr> <td></td> <td></td> </tr> </table>
属性: width :表格宽度 height :表格高度 border :边框 align :表格水平位置: * left * center * right
<td>的属性: * colspan=”列数” * rowspan=”行数”
HTML的表单标签:<form> * 常用属性: * action属性:提交的路径.默认提交到当前页面 * method属性:请求的方式.GET和POST.默认是GET. ***** GET方式和POST方式的区别? * GET :数据会显示到地址栏中.GET方式提交是有大小的限制. * POST :数据不会显示到地址栏中.POST方式提交的是没有大小限制. HTML中表单元素: * <input type=”text”> :文本框. * 常用属性: * name :表单元素的名称.必须有name属性,然后后台才可以接收数据. * value :文本框的默认值. * size :文本框的长度. * maxlength:文本框输入的最大长度. * readonly:只读文本框. * <input type=”password”> :密码框. * 常用属性: * name :表单元素的名称.必须有name属性,然后后台才可以接收数据. * value :密码框的默认值. * size :密码框的长度. * maxlength:密码框输入的最大长度.
* <input type=”radio”> :单选按钮. * 常用的属性: * name :表单元素的名称.必须有name属性,然后后台才可以接收数据. * value :单选按钮的默认值. * checked:单选按钮默认被选中.
* <input type=”checkbox”> :复选按钮. * 常用的属性: * name :表单元素的名称.必须有name属性,然后后台才可以接收数据. * value :单选按钮的默认值. * checked:单选按钮默认被选中.
* <input type=”button”> :普通按钮.没有任何功能的按钮. * <input type=”submit”> :提交按钮. * <input type=”reset”> :重置按钮. * <input type=”file”> :文件上传的表单项. * <input type=”hidden”> :隐藏字段. * <input type=”image”> :图片按钮
* <select> :下拉列表. * <textarea> :文本域.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <table border="1" width="90%" align="center"> <tr> <td> <!--Logo部分--> <table width="100%" border="1"> <tr> <td> <img src="img/logo2.png" /> </td> <td> <img src="img/header.png" /> </td> <td> <a href="#">登录</a> <a href="#">注册</a> <a href="#">购物车</a> </td> </tr> </table> </td> </tr> <tr> <td> <table width="100%" border="1" bgcolor="black" height="100%"> <tr> <td> <a href="">首页</a> <a href="">手机数码</a> <a href="">电脑办公</a> <a href="">烟酒糖茶</a> <a href="">鞋靴箱包</a> </td> </tr> </table> </td> </tr> <tr height="400" background="img/regist_bg.jpg"> <td> <form action="../案例四:网站的首页的显示/案例四:网站首页.html" method="post"> <table border="5" width="60%" align="center" bgcolor="white"> <tr> <td> 用户名 </td> <td> <input type="text" name="username" value="" size="20" maxlength="6" > </td> </tr> <tr> <td> 密码 </td> <td> <input type="password" name="password"/> </td> </tr> <tr> <td> 确认密码 </td> <td> <input type="password" name="repassword"/> </td> </tr> <tr> <td> 邮箱 </td> <td> <input type="text" name="email"/> </td> </tr> <tr> <td> 姓名 </td> <td> <input type="text" name="name"/> </td> </tr> <tr> <td> 性别 </td> <td> <input type="radio" name="sex" value="男" checked>男<input type="radio" name="sex" value="女">女 </td> </tr> <tr> <td> 爱好 </td> <td> <input type="checkbox" name="hobby" value="篮球" checked>篮球 <input type="checkbox" name="hobby" value="足球">足球 <input type="checkbox" name="hobby" value="排球">排球 <input type="checkbox" name="hobby" value="羽毛球">羽毛球 </td> </tr> <tr> <td> 籍贯 </td> <td> <select name="province"> <option>--请选择--</option> <option value="北京" selected>北京</option> <option value="上海">上海</option> <option value="广州">广州</option> </select> </td> </tr> <tr> <td> 头像 </td> <td> <input type="file" name="upload"> </td> </tr> <tr> <td> 简介 </td> <td> <textarea cols="20" rows="4" name="info">我是:</textarea> </td> </tr> <tr> <td> 生日 </td> <td> <input type="text" name="birthday"/> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="注册"/><input type="reset" value="重置"/><input type="button" value="我是按钮"> </td> </tr> </table> </form> </td> </tr> <tr> <td height="70"> <img src="img/footer.jpg" width="100%" height="100%"> </td> </tr> <tr> <td align="center"> <a href="../案例一:网站信息页面的显示/案例一:网站信息页面的显示.html">关于我们</a> 联系我们 招贤纳士 法律声明 <a href="../案例三:网站列表页面的显示/案例三:网站列表页面的显示.html">友情链接</a> 支付方式 配送方式 服务声明 广告声明 <br/> Copyright © 2005-2016 传智商城 版权所有 </td> </tr> </table> </body> </html>
|