Java基础 - 网络编程

7.网络编程

7.1概述

  • 计算机网络

    指的是将地理位置不同的具有独立功能的多台计算机设备,通过通信线路连接起来,在网络通信设备、操作系统和管理软件的协调下,实现资源共享和信息传递的环境

  • 网络编程

    实现网络互连的不同计算机上运行的程序间的进行数据交换,使用计算机语言来完成

  • 网络模型OSI

    • 应用层 (Application):

        网络服务与最终用户的一个接口。
      
        协议有:HTTP FTP TFTP SMTP SNMP DNS
      
    • 表示层(Presentation Layer):

        数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
      
        格式有,JPEG、ASCll、DECOIC、加密格式等
      
        这层的作用主要是数据处理成计算机能识别的东西或把数据处理成人能识别的东西
      
    • 会话层(Session Layer):

        建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
      
        对应主机进程,指本地主机与远程主机正在进行的会话
      
    • 传输层 (Transport):

        定义传输数据的协议端口号,以及流控和差错效验。
      
        协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
      
    • 网络层 (Network):

        进行逻辑地址寻址,实现不同网络之间的路径选择。
      
        协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
      
    • 数据链路层 (Link):

        建立逻辑连接、进行硬件地址寻址、差错效验等功能。(由底层网络定义协议)
      
        将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
      
        这层的数据通常叫做数据包
      
    • 物理层(Physical Layer):

        建立、维护、断开物理连接。(由底层网络定义协议)
      

7.2网络编程三要素

IP, 端口号, 协议

7.2-1 IP

  • 定义

    想要让网络中的计算机相互通信,就必须为每一台计算机指定一个唯一的标识号,通过这个标识号就能找到这台计算机,在TCP/IP协议中,这个标识号就是IP地址

  • 组成

    网络号段+主机号段

  • 分类

    分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同(DE两类地址目前没有见过)

    • A类地址网络号范围:1.0.0.0---126.0.0.0
    • B类地址网络号范围:128.0.0.0---191.255.0.0
    • C类地址网络号范围:192.0.0.0---223.255.255.0(其中192.168.X.X是私有地址)
    • D类地址范围:224.0.0.0---239.255.255.255
    • E类地址范围:240.0.0.0---255.255.255.254
  • 特殊IP

    127.0.0.1 表示的是回环地址(表示本机)

    X.X.X.255 广播地址

  • InetAddress

    InetAddress implements Serializable

    此类表示IP地址,包含了操作IP的相关方法

    • 常用方法

        static InetAddress getByName(String host) 通过主机名/域名/IP地址获得IP地址对象
      
        static InetAddress getLocalHost() 返回本地主机IP
      
        InetAddress对象的方法:
      
        public String getHostName() 获取主机名称
      
        public String getHostAddress()  获取主机IP
      

7.2-2 端口

  • 端口主要分为物理端口和逻辑端口,我们程序中说的端口指的都是逻辑端口

  • 端口的作用是给计算机上运行中的程序一个标识,不同的程序在运行时有不同的逻辑端口

  • 有效端口范围是:065535,其中01024为系统使用和保留端口

7.2-3 协议

  • UDP

    1. 不需要建立连接

    2. 将数据源和目的封装到数据包中,每个数据包的大小限制在64K内

    3. 因面向无连接,是不可靠的协议,传输速度快

    4. 特点:只管发,不管结果你收到没有,例如发短信

  • TCP

    1. 建立连接

    2. 形成数据传输通道,在通道中进行数据的传输

    3. 通过三握手完成连接,是可靠的传输协议。

    4. 因需要建立连接,效率稍低,但是安全,例如打电话

7.2-4 Socket套接字

  • 定义

    Socket就是一个封装了IP地址和端口号组合在一起的能识别一台唯一计算机上程序的对象.

    该对象还封装了多台计算机之间通信的流对象.

  • Socket机制

    1. 通信的两端都有Socket

    2. 网络通信就是Socket之间的通信

    3. 数据在两个Socket之间,在某种协议的规则下通过IO传输

7.2-5 网络编码解码

网络传输数据需要进行编码和解码

  • 常用类:

    • URLEncoder:提供将String编码为网络传输数据格式的静态方法

      1. 用一些编码机制将不安全字符转成一个或者多个字节

      2. 每个字节用一个包含3个字符的字符串"%xy"表示,其中xy为该字节的16进制表示

      3. 推荐UTF-8

    • URLDecoder:提供将网络传输数据解码为String格式的静态方法

  • 示例代码

       String str = "你好吗123";
       //由于网络HTML不能传输中文,要进行网络编码
       str = URLEncoder.encode(str,"UTF-8");//编码
       System.out.println(str);
    
       //网络解码
       str = URLDecoder.decode(str,"UTF-8");
       System.out.println(str);
    

7.3 UDP编程

DatagramSocket

此类封装了UDP协议,用来发送和接收数据包的套接字。

  • 构造方法

      DatagramSocket() 用于发送端创建对象
    
      DatagramSocket(int port)  用于接收端创建对象,绑定的port端口号为发送端指定的目标端口
    
  • 常用方法

      void send(DatagramPacket p) 发送数据包
    
      receive(DatagramPacket p) 接收数据, DatagramPacket的缓冲区填充了接收的数据
    

DatagramPacket

表示数据包对象

  • 构造方法

      DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    
      构建发送端数据包, buf:发送的数据  length:数据长度  address:ip地址  port:端口
    
      DatagramPacket(byte[] buf, int length)
    
      构建接收端数据包,此时数据包仅作为缓冲区使用, buf:缓冲数组 length:缓冲长度    
    
  • 常用方法

      InetAddress getAddress()  返回IP地址
    
      byte[] getData()  返回缓冲区接收到的数据
    
      int getLength() 返回发送或者接收数据的长度   
    

发送端

  • 发送步骤

    1. 创建DatagramSocket对象

    2. 准备数据,打成数据包

    3. 调用方法发送数据包

    4. 关闭资源

  • 示例代码

      //1.创建socket对象
      DatagramSocket socket = new DatagramSocket();
      //2.将发送数据打成数据包
      String info = "你的数据";
      byte[] bytes = info.getBytes();
      InetAddress address = InetAddress.getByName("192.168.1.1");//目标的IP地址
      int port = 10088; //目标端口
      DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
      //3.发送数据包
      socket.send(packet);
      //4.关闭资源
      socket.close();
    

接收端

  • 接收步骤

    1. 创建DatagramSocket对象

    2. 创建一个数据包

    3. 调用方法接收数据包

    4. 解析数据包

    5. 关闭资源

  • 示例代码

      DatagramSocket socket = new DatagramSocket(10088);
      DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
      socket.receive(packet);//接收数据到数据包的缓冲区
      //获得发送方的ip
      String address = packet.getAddress().getHostAddress();
      //获取数据包的数据
      byte[] data = packet.getData();
      //获取数据长度
      int length = packet.getLength();
      //关闭资源
      socket.close();
    
  • 注意

    必须先开启接收端,再开发送端

7.4 TCP编程

  • 客户端

    • Socket

      客户端通信的套接字

    • 构造方法

         Socket(String host, int port)  创建套接字对象,并将其连接到指定主机上的指定端口
      
    • 常用方法

        OutputStream getOutputStream() 获取套接字的输出流
      
        InputStream getInputStream()  获取套接字的输入流
      
        void shutdownInput()
      
        void shutdownOutput() //告诉对方流对象用完了,否则会导致对方一直在等你给对方发/收数据,所有流用完后必须主动调用这些方法
      
    • 步骤

        1:创建Socket对象(如果对象创建成功,表示完成三握手,连接成功创建)
      
        2:获取输出流,写数据
      
        3:关闭资源
      
    • 示例代码

        //创建对象如无报错,表示连接成功
        Socket socket = new Socket("localhost",10099);
        //获取流对象写数据
        OutputStream out = socket.getOutputStream();
        String data = "hello tcp";
        out.write(data.getBytes());
        //告诉服务端数据发完了
        socket.shutdownOutput();
      
        //获取服务端响应返回的数据
        InputStream in = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) != -1){
            System.out.println(new String(buf,0,len));
        }
        System.out.println("接收完服务器返回的数据了");
      
        socket.close();
      
  • 服务端

    • ServerSocket

      服务端通信的套接字

    • 构造方法

        ServerSocket(int port) 绑定到特定端口
      
    • 常用方法

        Socket accept() 监听客户端连接
      
    • 处理步骤

        1:创建ServerSocket对象
      
        2:监听客户端的连接
      
        3:获取输入流读取数据
      
        4:关闭资源(服务端一般不关闭)
      
    • 示例代码

        ServerSocket socket = new ServerSocket(10099);
        //监听客户端连接
        Socket accept = socket.accept();//阻塞
        //获取输入流,接收客户端发送的数据
        InputStream in = accept.getInputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) != -1){
            System.out.println(new String(buf,0,len));
        }
      
        //响应客户端
        OutputStream out = accept.getOutputStream();
        out.write("接收到你的信息了".getBytes());
        //告诉客户端数据发完了
        accept.shutdownOutput();
        socket.close();         
      
  • TCP协议

    三握手

    1. 客户端发送请求到服务端,等待服务器确认

    2. 服务端收到信息后,响应客户端

    3. 客户端收到服务器的反馈,向服务器发送确认信息,完成三次握手

  • 案例

    文件上传,把本地的文件放到服务器上

      1:要读本地文件(IO流)
    
      2:要使用网络Socket
    
      3:再使用Socket上的流把数据传入服务器

你可能感兴趣的:(Java基础 - 网络编程)