首页 > 代码库 > java自学之路-day20

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地址

  1. 计算机的唯一标识
  2. 以能够指定传输数据和发送数据
  3. 广泛使用的IPv4
  4. 在计算机中以四个字节的二进制数来表示
  5. 为了方便识别 将每个字节用十进制数表示 用.隔开 0-255
  6. IP地址需求越来越多 可能出现饱和
  7. 出现了IPv6
  8. 用16个字节表示
  9. 是IPv4的8*10的28次方倍 达到2的128次方个
  10. 解决了资源不够的问题
  11. 本机回环地址

127.0.0.1 代表本机地址

 

l  端口号

  1. IP地址可以连接到某个计算机
  2. 访问计算机中的某个程序
  3. 需要端口号
  4. 由操作系统进行分配
  5. 有两个字节组成16位的二进制数 0-65535
  6. 0-1024之前的不能用 因为已经被知名程序或网络服务占用
  7. 例如浏览器端口号 80

InetAddress类

l  表示互联网中的IP地址

l  Java.net.InetAddress

l  不可以实例化对象

l  静态方法获取

  1. Static InetAddress getLocalHost()
  2. 返回值是InetAddress对象
  3. 输出后是ip地址和主机名

 

 

l  其他静态方法

  1. String getHostAddress() 返回主机地址
  2. String getHostName()  返回主机名称

 

 

l  获取非本机的ip对象

  1. static InetAddress getByname(String hostNmae)
  2. 传递主机名获取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的对象 包装数据和设置接收端的地址和端口

  1. 构造方法传入参数

l  发送端创建DatagramSocker的对象 发送数据包

  1. 调用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  构造方法

  1. Socket(Stringhost,int port)
  2. 传递服务器ip和端口号
  3. 构造方法只要运行就会和服务器进行连接 连接失败抛出异常
  4. OutputStream getOuputStream()返回套接字的输出流

将数据输出,输出到服务器

  1. InputStream getInputStream() 返回套接字的输入流

将数据输入,从服务端读取数据

  1. 示例

 

 

ServerScoket

l  此类实现了服务器端的套接字

l  构造方法

ServerScoket(int port)传递客户端要求的端口号

l  服务器需要知道谁连接上了服务器 因此需要获得服务器的套接字对象

l  获取方法

accept()返回客户端的套接字对象

l  示例

 

客户端和服务端交换数据

l  客户端

 

l  服务端

 

TCP中的流对象

 

ShutdownOutput

l  读网络流中的字节数组读不到-1

l  如果循环读取就会死循环

l  这是用到这个方法

l  禁用此套接字的输出流

l  如果调用了此方法就会抛出异常

 

l  Read遇到抛出异常就会返回-1

l  循环就停了下来

 

java自学之路-day20