java自学之路-day20
JAVA20
网络编程
网络通信协议
l 计算机网络中的各个电脑可以互传数据
l 传输数据有一定的规则 就是网络协议
l 对数据的传输格式 速率 步骤都有规定
l 必须遵循规则才能传输数据
l 有很多种,最广泛的是TCP/IP和UDP
l 主要学习TCP/IP
TCP/IP协议的网络模型
l 应用层
应用程序的协议
l 传输层
使网络程序进行通信 UDP和TCP
l 网络层
TCP/IP核心层
l 链路层
光纤,网线驱动协议
IP地址和端口号
l IP地址
- 计算机的唯一标识
- 以能够指定传输数据和发送数据
- 广泛使用的IPv4
- 在计算机中以四个字节的二进制数来表示
- 为了方便识别 将每个字节用十进制数表示 用.隔开 0-255
- IP地址需求越来越多 可能出现饱和
- 出现了IPv6
- 用16个字节表示
- 是IPv4的8*10的28次方倍 达到2的128次方个
- 解决了资源不够的问题
- 本机回环地址
127.0.0.1 代表本机地址
l 端口号
- IP地址可以连接到某个计算机
- 访问计算机中的某个程序
- 需要端口号
- 由操作系统进行分配
- 有两个字节组成16位的二进制数 0-65535
- 0-1024之前的不能用 因为已经被知名程序或网络服务占用
- 例如浏览器端口号 80
InetAddress类
l 表示互联网中的IP地址
l Java.net.InetAddress
l 不可以实例化对象
l 静态方法获取
- Static InetAddress getLocalHost()
- 返回值是InetAddress对象
- 输出后是ip地址和主机名
l 其他静态方法
- String getHostAddress() 返回主机地址
- String getHostName() 返回主机名称
l 获取非本机的ip对象
- static InetAddress getByname(String hostNmae)
- 传递主机名获取ip地址对象
UDP协议
l 是传输层两个重要的高级协议之一
l 无连接通信协议
l 数据传输的两端不建立逻辑连接
l 发送端不会确认接收端是否存在 接收端也不会反馈是否收到数据
l 消耗资源小 通信效率高 常用于音频视频 普通数据的传输
l 例如视频会议 空间留言
l 即使丢失一两个数据包 也不会对接收结果产生太大影响
l 比如电脑视频同步只是会卡一点而已 并不会有太大影响
l 数据大小在64kb内
TCP协议
l 面向连接的是通信协议
l 提供了两台计算机之间可靠无差错的数据传输
l 必须明确客户端和服务端
l 每次连接需要“三次握手”
l 客户端发出连接请求 服务端反馈允许连接 客户端反馈连接成功
l 连接速度慢但是安全性高
l 被广泛采用
l 下载文件必须使用TCP
l 两台计算机
l
UDP通信
数据包和发送对象
l 两台计算机
l 一台发送一台接收
l 发送端需要知道接收方法ip和端口号
l 数据需要包装才能发送
DatagramPacket
l 包装数据 相当于码头的集装箱
l 封装数据 接收端的地址和端口
l 接收数据 绑定端口号和发送端一致
DatagramSocker
l 将包装好的数据发送/接收 相当于码头的作用
实现步骤
l 发送端创建DatagramPacket的对象 包装数据和设置接收端的地址和端口
- 构造方法传入参数
l 发送端创建DatagramSocker的对象 发送数据包
- 调用send方法传入DatagramPacket对象进行传递即可
l 发送端关闭资源 发送对象DatagramSocker
l 示例
l 接收端创建DatagramPacket的对象 绑定端口号
l 接收端创建字节数组加收发送来的数据
l 接收端创建DatagramSocker的对象 传入数组和数组长度
l 调用receive方法接收数据 传入参数 DatagramPacket的对象
l 拆包
发送的IP地址
接收的字节个数
发送方的端口号
l 关闭资源
l 示例
运行后没有结束 因为receive具有线程等待 会检测udp的发送 如果不发送数据就会一直在检测
拆包
但是数组长度太大造成浪费
所以调用DatagramPacket的getlength方法返回接收的数据长度
拆包IP地址
调用DatagramPacket的getAddress 获取到发送端的IP对象
通过这个对象就能得到IP地址和主机名
拆包发送端端口号
调用datagramPacket的方法getport
TCP通信
l 有明确的客户端和服务器
l 服务端类 ServerSocket
l 客户端类 Scoket
l 客户端主动连接服务器
l 服务器提前启动等到客户端连接
l 客户端请求服务器
l 服务器同意连接
l 客户端和服务端形成一个通路 有一个对象就建立完毕了
l 这个对象就是IO流对象 字节流
l 可以进行数据交换
l 客户端输出 服务端输入 服务端输出 客户端输入
Scoket类
l 此类实现了客户端的套接字 套接字就是两台机器通信的端点
l Java.net.Socket
l 构造方法
- Socket(Stringhost,int port)
- 传递服务器ip和端口号
- 构造方法只要运行就会和服务器进行连接 连接失败抛出异常
- OutputStream getOuputStream()返回套接字的输出流
将数据输出,输出到服务器
- InputStream getInputStream() 返回套接字的输入流
将数据输入,从服务端读取数据
- 示例
ServerScoket
l 此类实现了服务器端的套接字
l 构造方法
ServerScoket(int port)传递客户端要求的端口号
l 服务器需要知道谁连接上了服务器 因此需要获得服务器的套接字对象
l 获取方法
accept()返回客户端的套接字对象
l 示例
客户端和服务端交换数据
l 客户端
l 服务端
TCP中的流对象
ShutdownOutput
l 读网络流中的字节数组读不到-1
l 如果循环读取就会死循环
l 这是用到这个方法
l 禁用此套接字的输出流
l 如果调用了此方法就会抛出异常
l Read遇到抛出异常就会返回-1
l 循环就停了下来