一、网络编程
1.OSI七层模型和TCP五层模型
OSI:应用层->表示层->会话层->传输层->网络层->数据链路层->物理层
TCP:应用层 ->传输层->网络层->数据链路层->物理层
当发送数据时,按照以上顺序层层装包将数据发送,当接受数据时按照相反方向层层拆包获取数据
2.通信协议
2.1TCP通信协议特点(传输控制协议,类似打电话):
1)建立连接,进行通信且通信阶段全程保持连接(保持了数据的可靠性和有序性),断开连接的方式
2)传输数据前进行三次握手(1.我准备要发送数据了 2.我已接受你的通知可以发送 3.我已接受你的接受通知,同时这时候就可以发送数据了)
3)全双工(同时在两个方向上进行传输,将可用通道分为两部分,一部分用于发送数据,另一部分用于接收数据。)字节流通信方式,可实现大数据传输
4)每次输出完毕后需要释放连接发送效率比较低
2.2UDP通信协议特点(用户数据包协议,类似于写信):
1)不需要保持连接,也就是不需要建立连接
2)不保证数据的可靠性和有序性
3)全双工数据包通信方式,数据包大小限制在64KB
4)发送数据完毕后无需释放连接开销小,效率快
3.IP地址和端口号(网络编程需要IP+端口号组成套接字socket)
3.1 IP(定位一台设备)
IP地址中,192.168.1.1是绝大多数路由器的登录地址用于配置用户名和密码与Mac过滤。127.0.0.1代表本地回环地址主机名:localhost
IP地址是互联网中唯一地址表示本质上主流是32位二进制整数的IPV4,而且日常生活中采用点分十进制方式表示
查看IP地址:dos窗口:ipconfig
3.2端口号(定位一台设备的一个进程)
十六位二进制整数组成,表示范围:0-65535其中0~1024被系统占用
特殊端口号:HTTP:80 FTP:21 Oracle:1521 Mysql:3306 Tomcat:8080
4.基于TCP协议的编程模型(重点)
4.1C/S架构:
客户端部分:每个用户独有,负责执行前台功能
服务器部分:多个用户共享信息和功能,负责后台服务
4.2相关类和方法
客户端的套接字对应服务器的套接字都包含输入输出流,都是通过客户端Socket创建输入输出流
客户端的socket.getInputStream()连接服务器的socket.getOutputStream()
客户端的socket.getOutputStream()连接服务器的socket.getInputStream()
ServerSocket类:服务器套接字
ServerSocket(int port):根据参数指定端口号构造对象
Socket accpet():侦听并接受套接字的连接请求
void close():用于关闭套接字
Socket类:客户端套接字,两台机器通信的端点
Socket(String ip, int port):指定服务器的主机名和端口构造套接字对象
InputStream getInputStream():获取套接字的输入流
OutputStream getOutputStream():获取套接字的输出流
void close():关闭套接字
4.3编程模型:
服务器:
创建ServerSocket对象并提供端口号
通过accept方法等待用户连接
使用输入输出流通信
关闭Socket套接字
客户端:
创建Socket对象并提供服务器的IP和端口号连接
使用输入输出流通信
关闭Socket套接字
4.4常用代码说明(里面的类和方法都是常用的)
双方用的套接字是同一个,所以输入输出流都是相对应的,可实现同时双向传输数据
创建服务器的线程类,在每个客户端的套接字连接进来时,使用合成复用原则,将套接字对象作为一个该类的一个新特性,通过新对象调用该对象来达到复用功能。每个套接字一个线程
服务器端 套接字:永远不关闭,一直处于等待连接状态
客户端:
创建套接字socket
利用scanner类获取输入
将输入的字符串传入printStream类(接受OutputStream类),再用println方法将字符串写进输出流中(对应服务器的输入流)
获取客户端的输入流对应服务器的输出流,将其转为字符流再转为BufferedReader进行打印
5.UDP
5.1编程模型
接收方:
创建DatagramSocket对象并提供端口号
创建DatagramPacket对象提供缓冲区
通过socket接收数据放入packet中调用receive方法
关闭socket
发送方:
创建DatagramSocket对象
创建DatagramPacket对象提供缓冲区并提供接收方的通信地址(IP和port)
通过socket将packet数据发送调用send方法
关闭socket方法
5.2相关类方法
DatagramSocket类:用于描述发送和接受数据包的套接字(类似邮局)
DatagramSocket()无参构造:用于发送方
DatagramSocket(int port)指定端口号构造对象:用于接收方
receive(DatagramPacket p)接收数据包放到 p中
send(DatagramPacket p)将数据包发出
close()关闭套接字
DatagramPacket类:描述数据包,实现无连接包裹投递
DatagramPacket(byte[] buf, int length)制定参数构造对象接受数据包用于接收方
DatagramPacket(byte[] buf, int length, InetAddress address, int port)制定参数构造对象发送数据包用于发送方发送到指定端口
InetAddress getAddress() 获取发送方或接收方的通信地址
int getPort()获取发送方或接收方的端口号
int getLength()数据长度
InetAddress类:描述互联网通信地址
static InetAddress getLocalHost()获取通信地址
static InetAddress getByName(String host)根据制定主机名获取通信地址
3.代码说明
接收方 :
构建DatagramSocket对象提供端口号说明为接收方
创建DatagramPacket并调用receive方法接受数据包
同时可以传输数据创建另一个DatagramPacket并将传输的地址放入调用send方法,因为DatagramPacket中已经指定了传输到那个IP和port
因为dp.getAddress和dp.getPort方法可以在receive之后获得发送方的IP和Port。
发送方
6.URL类
统一资源定位器,可以是简单的文件或目录也可以是复杂对象的引用。通过URL可以访问网络资源
6.1常用方法
URL(String spec)按照参数构造对象
String getProtocol() 获取协议名
String getHost():主机名
int getPort()端口号名
String getPath:路径名
String getFile:获取文件名
URLConnection openConnection()获取URLConnection类实例
URLConnection类
inputStream getInputStream()获取输入流,可以获取资源内容放入文件中
void disconnect()断开连接
二、反射机制
也叫动态编码技术:动态创建对象并动态调用方法的机制(运行代码时由传递的参数决定创建或运行什么样的方法)
1.Class类:用于描述Java类或者接口也就是以数据类型
1.1获取Class对象常用方法
1)数据类型.Class方式:Class c1 = String.class;
2)调用class类forname方法:Class c1 = Class.forName(“java.lang.String”);
获取到Class对象后创建该类的实例:c1.newInstace();
2.Constructor类:用于描述构造方法的信息
2.1Class类常用方法
1)Constructor getConstructor(Class<?>...parameterTypes):获取Class对象中参数指定的构造方法
2)Constructor<?>[] getConstructors:获取Class对象中所有公共构造方法,返回的是数组
2.2Constructor类常用方法
T newInstance(Object ...):用Constructor对象构造Class对象代表类的实力
int getModifiers():获取方法的修饰符
String getName():获取方法的名字
Class<?>[] getParameterTypes():获取方法所有参数类型
3.Field类:用于描述单个成员变量
3.1Class常用方法
Field getDeclaredField(String name)获取Class对象中指定参数的单个成员变量信息
Field[] getDeclaredFields()获取Class对象中所表示类中所有成员变量信息
3.2Field常用方法
Object get(Object obj):获取参数对象obj中此Field对象所表示成员变量的值 obj一般是Class对象实例
void set(Object obj, Object value):设置参数对象obj中此Field对象所表示成员变量的值为value obj一般是Class对象实例
void setAccessible(boolean flag):参数为true时取消Java语言访问检查,也就是private修饰的成员变量也可以访问
int getModifiers():成员变量访问修饰符
Class<?> getType():成员变量数据类型
String getName():成员变量名称
3Method类:单个成员方法
4.其他结构信息
由Class对象调用