十六、网络编程


网络编程

  • 网络编程可以让程序与网络上的其他设备中的程序进行数据交互

  • 网络通信的基本模式:常见的通信模式有如下2种形式:Client-Server(CS)、Browser/Server(BS)

网络通信三要素

  • 三要素概述、要素一:IP地址(设备在网络中的地址,是唯一的标识)

    • IP(Internet Protocol):全称“互联网协议地址”,是分配给上网设备的唯一标志。

    • 常见的IP分类为:IPv4和IPv6

      • IPv4:32位

      • IPv6:

        • 128位(16个字节),号称可以为地球每一粒沙子编号

        • IPv6分成8个整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开即冒分十六进制表示法

    • IP地址形式:

      • 公网地址、和私有地址(局域网使用)

      • 192.168.开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用

    • IP常用命令:

      • ipconfig:查看本机IP地址

      • ping IP地址:检查网络是否连通

    • 特殊IP地址:

      • 本机IP:127.0.0.1或者localhost:称为回送地址也可称本地回环地址,只会寻找当前所在本机

  • IP地址操作类-InetAddress

    • InetAddress的使用

      • 此类表示Internet协议(IP)地址

    • InetAddress API如下

      • 名称说明
        public static InetAddress getLocalHost() 返回本主机的地址对象
        public static InetAddress getByName(String host) 得到指定主机的IP地址对象,参数是域名或者IP地址
        public String getHostName() 获取此IP地址的主机名
        public String getHostAddress() 返回IP地址字符串
        public boolean isReachable(int timeout) 在指定毫秒内连通该IP地址对应的主机,连通返回true

         

  • 要素二:端口号(应用程序在设备中唯一的标识)

    • 端口号:标识正在计算机设备上运行的进程(程序),被规定为一个16位的二进制,范围是0~65535

    • 端口类型:

      • 周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)

      • 注册端口:1024~49151,分配给用户进程或某些应用程序(如:Tomcat占用8080,MySql占用3306)

      • 动态端口:49152~65535,之所以称为动态端口,是因为他一般不固定分配某种进程,而是动态分配

      • 注意:我们自己开发的程序选择注册端口,且一个设备中不能出现两个程序端口号一样,否则出错

  • 要素三:协议(数据在网络中传输的规则,常见的协议有UDP协议和TCP协议)

    • 通信协议:连接和通信数据的规则被称为网络通信协议

    • 网络通信协议有两套参考模型

      • OSI参考模型:世界互联协议标准,全球通信规范,由于此模型过于理想化,未能在因特网上进行广泛推广

      • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

      • OSI参考模型TCP/IP参考模型各层对应面向操作
        应用层 应用层 HTTP、FTP、DNS、SMTP…… 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发
        表示层 应用层 HTTP、FTP、DNS、SMTP…… 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发
        会话层 应用层 HTTP、FTP、DNS、SMTP…… 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发
        传输层 传输层 TCP、UDP…… 选择使用的TCP、UDP协议
        网络层 网络层 IP、ICMP 封装源和目标IP,进行路径选择
        数据链路层 数据链路层+物理层 物理寻址、比特流…… 物理设备中传输
        物理层 数据链路层+物理层 物理寻址、比特流…… 物理设备中传输
    • 传输层的2个常见协议:

      • TCP(Transmission Control Protocol):传输控制协议

      • UDP(User Datagram Protocol):用户数据报协议

    • TCP协议特点:

      • 使用TCP协议,必须双方先建立连接,它是一种面向连接可靠通信协议

      • 传输前,采用“三次握手”方式建立连接,所以是可靠的

      • 在连接中可进行大数据量的传输

      • 连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低

    • TCP协议通信场景

      • 对信息安全要求较高的场景,例如:文件下载、金融等数据通信

    • UDP协议:

      • UDP是一种无连接、不可靠传输的协议

      • 将数据源IP、目的地IP和端口封装成数据包,不需要建立连接

      • 每个数据包的大小限制在64KB内

      • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的

      • 可以广播发送,发送数据结束时无需释放资源,开销小、速度块

    • UDP协议通信场景

      • 语音通话,视频会话等

UDP通信-快速入门

  • 快速入门

    • DatagramPacket:数据包对象(韭菜盘子)

      • 构造器说明
        public DatagramPacket(byte[] buf,int length,InetAddress address,int port) 创建发送端数据包对象buf:要发送的内容,字节数组 length:要发送内容的字节长度 address:接收端的IP地址对象 port:接收端的端口号
        public DatagramPacket(byte[] buf,int length) 创建接收端的数据包对象buf:用来存储接收的内容 length:能够接收内容的长度
    • DatagramPacket常用方法

      • 方法说明
        public int getLength() 获得实际接受的字节个数
    • DatagramSocket:(发送端和接收端对象(人))

      • 构造器说明
        public DatagramSocket() 创建发送端Socket对象,系统会随机分配一个端口号
        public DatagramSocket(int port) 创建接收端的Socket对象并指定端口号
    • DatagramSocket类成员方法

      • 方法说明
        public void send(DatagramPacket dp) 发送数据包
        public void receive(DatagramPacket p) 接收数据包

         

  • 多发多收

UDP通信-广播、组播

  • UDP的三种通信方式

    • 单播:单台主机与单台主机之间的通信

    • 广播:当前主机与所在网络中的所有主机通信

    • 组播:当前主机与选定的一组主机的通信

  • UDP如何实现广播

    • 使用广播地址:255.255.255.255

    • 具体操作:

      • 发送端发送的数据包的目的地写的是广播地址、且指定端口

      • 本机所在网段的其他主机的程序只要匹配端口成功即就可以收到消息了

  • UDP如何实现组播

    • 使用组播地址:224.0.0.0 ~ 239.255.255.255

    • 具体操作:

      • 发送端的数据包的目的地是组播IP

      • 接收端必须绑定该组播IP,端口还要对应发送端的端口号,这样即可接收组播消息

      • DatagramSocket的子类MuIticastSocket可以在接收端绑定组播IP

TCP通信-快速入门

  • 编写客户端代码

    • Socket

      • 构造器说明
        public Socket(String host,int port) 创建发送端的Socket对象与服务端连接,参数为服务端程序的IP和端口
    • Socket类成员方法

      • 方法说明
        OutputStream getOutputStream() 获得字节输出流对象
        InputStream getInputStream() 获得做节输入流对象
    • net-app.src.com.itheima.d5_socket1.ClientDemo1

  • 编写服务端代码、原理分析

    • ServerSocket(服务端)

      构造器说明
      public ServerSocket(int port) 注册服务端端口
    • ServerSocket类成员方法

    • 方法说明
      public Socket accept() 等待接收客户端Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信
    • net-app.src.com.itheima.d5_socket1.ServerDemo2

TCP通信-多发多收消息

  • net-app.src.com.itheima.d6_socket2.ClientDemo1

  • net-app.src.com.itheima.d6_socket2.ServerDemo2

TCP通信-同时接受多个客户端消息

  • net-app.src.com.itheima.d7_socket3.ClientDemo1

  • net-app.src.com.itheima.d7_socket3.ServerDemo2

  • net-app.src.com.itheima.d7_socket3.ServerReaderThread

TCP通信-使用线程池优化

  • net-app.src.com.itheima.d8_socket4.ClientDemo1

  • net-app.src.com.itheima.d8_socket4.ServerDemo2

  • net-app.src.com.itheima.d8_socket4.ServerReaderRunnable

TCP通信实战案例-即时通信

  • net-app.src.com.itheima.d9_socket5

TCP通信实战案例-模拟BS系统

  • net-app.src.com.itheima.d10_bs