网络编程在Java中的使用——UDP通信程序 + TCP通信程序

目录

1. UDP通信程序不管对方能不能接收到,都要发

注意:要先开启接收数据,再开启发送数据因为发送数据不管有没有程序接收,他都会发送,如果先运行发送数据,可能会造成数据都发完了,接收数据才开始运行。容易造成数据丢失。

单播——聊天室(群聊)——>多个人一起发消息,只有一个容器接收。一般使用本机IP ——127.0.0.1

发送数据:(随机/指定) 快递公司——>将东西打包装箱——>将快递派送——>快递公司离开

-1- 找快递公司 —— 创建发送端的 DatagramSocket 对象

-2- 打包礼物 —— 数据打包( DatagramPacket )

-3- 快递公司发送箱子 —— 发送数据——>send()

-4- 快递公司离开 —— 释放资源——>close()

接收数据:快递公司 根据地址 过来——>准备容器——>签收箱子——>拆开箱子得到里面的数据——>快递公司离开先运行接收数据,再运行发送数据,

-1- 快递公司 根据地址 过来 —— 创建接收端的 DatagramSocket 对象

-2- 准备容器 —— 确定要放箱子的位置空间和大小

-3- 签收箱子 —— 接收打包好的数据 ——>receive()

-4- 从箱子里面获取礼物 —— 解析数据包

-5- 快递公司离开 —— 释放资源——>close()

应用场景——聊天室——>CSDN链接 :http://t.csdnimg.cn/2uNle ——>IDEA文件:package com.itheima.a03udpdemo2;

组播——老师讲课(一对多)——>一个人发消息,在教室的人(加入组播地址)才可以接收组播地址:224.0.0.0~239.255.255.255其中224.0.0.0~224.0.0.255 为预留的组播地址

发送数据: 创建老师——>准备教材内容——>确定教室——>汇总信息——>开始讲课——>下课

-1- 创建老师——.创建MulticastSocket对象

-2- 准备教材内容——创建要发送的字符串 转成 字节数组

-3- 确定教室——指定组播地址(区域地址)

-4- 汇总信息(资源包)——> 创建DatagramPacket 对象

-5- 开始讲课——>send()

-6- 下课——> close()

接收数据:创建要学这一科目的学生——>获取教室信息——>到达教室——>准备接收资源包的位置和大小——>接收数据——>整理笔记——>下课

-1- 创建要学这一科目的学生(指定端口号)——.创建MulticastSocket对象

-2- 获取教室信息——获取区域地址——创建InetAddress对象

-3- 到达教室——加入这一区域地址中——>joinGroup()

-4- 准备接收资源包的位置和大小——创建DatagramPacket对象

-5- 接收数据——receive()

-6- 整理笔记——解析数据

-7- 下课——close()

广播——公开演讲,直播——>一个人发消息,所有人都能收到。广播地址:255.255.255.255

广播和单播实现过程一致,只是将接收端的电脑IP改为 255.255.255.255就可以

2. TCP通信程序通信之前保证连接已经建立

特点:TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生I0流来进行网络通信

细节1:在创建对象的同时会连接服务端 如果连接不上,代码会报错​细节2:IO流是在连接通道里面的。 通道方向从客户端到服务端,所以客户端是输出流,服务端是输入流

发送数据:(客户端)——>Socket

-1- 创建客户端的Socket对象(Socket)与指定服务端连接——>Socket(String host, int port)

-2- 获取输出流,写数据——> Outputstream getoutputstream()

-3- 释放资源——> void close()

接收数据:(服务器)——>ServerSocket

-1- 创建服务器端的Socket对象(ServerSocket) ——> ServerSocket(int port)

-2- 监听客户端连接,返回一个Socket对象 ——> Socket accept()

-3- 获取输入流,读数据,并把数据显示在控制台 ——> InputStream getInputStream()

-4- 释放资源 ——> void close()

补充知识点:

1.客户端(发送) <——> 服务端(接收) 完整逻辑

2. TCP通信程序(三次握手)——>确保连接

3. TCP 通信程序(四次挥手)——>确保连接断开,且数据处理完毕


 

构架图

 

  • 1. UDP通信程序
    不管对方能不能接收到,都要发

    • 注意:要先开启接收数据,再开启发送数据
      因为发送数据不管有没有程序接收,他都会发送,如果先运行发送数据,可能会造成数据都发完了,接收数据才开始运行。容易造成数据丢失。
    • 单播——聊天室(群聊)——>多个人一起发消息,只有一个容器接收。
      一般使用本机IP ——127.0.0.1
      • 发送数据:(随机/指定) 快递公司——>将东西打包装箱——>将快递派送——>快递公司离开
        • -1- 找快递公司 —— 创建发送端的 DatagramSocket 对象

          • 构造方法: DatagramSocket ds = new DatagramSocket();
            绑定端口:以后我们就是通过这个端口往外发送
            • 空参:所有可用的端口中随机一个进行使用
            • 有参:指定端口号使用(电脑的端口号)
        • -2- 打包礼物 —— 数据打包( DatagramPacket )

          • 构造方法: public DatagramPacket(byte buf[], int length, InetAddress address, int port)
            参数:字符数组,数组的长度,InetAddress类型的IP地址(要接收的电脑IP地址),使用程序 对应的 端口号
          • 指定IP地址(InetAddress address):public static InetAddress getByName(String host)
        • -3- 快递公司发送箱子 —— 发送数据——>send()

        • -4- 快递公司离开 —— 释放资源——>close()

      • 接收数据:快递公司 根据地址 过来——>准备容器——>签收箱子——>拆开箱子得到里面的数据——>快递公司离开
        先运行接收数据,再运行发送数据,
        • -1- 快递公司 根据地址 过来 —— 创建接收端的 DatagramSocket 对象

          • 构造方法: DatagramSocket ds = new DatagramSocket(发送端程序的端口号);
          • 细节:在接收的时候,一定要绑定端口;而且绑定的端口一定要跟发送的程序端口保持一致
        • -2- 准备容器 —— 确定要放箱子的位置空间和大小


          (和发送数据的 打包数据方法 一致,只是参数不同)
          • 构造方法: public DatagramPacket(byte buf[], int length) {}
            参数: 接收数据的数组,要使用多长的数组长度(一般是全部长度)
        • -3- 签收箱子 —— 接收打包好的数据 ——>receive()


          细节:该方法是阻塞的,程序执行到这一步的时候,会在这里等着直到 发送端 发送消息
        • -4- 从箱子里面获取礼物 —— 解析数据包

          • 4.1 取出 容器中 的 data数据放进数组中——>getData()
          • 4.2 确定实际数据的长度——>getLength()
          • 4.3 确定发送数据的电脑IP——>getAddress()
            发出数据的电脑的 IP地址(不是真的IP地址,只是和IP地址属性值相同的InetAddress类型)
            ​要真正的 IP地址,需要再继续调用getHostAddress()返回 文本显示中的 IP地址字符串
          • 4.4 确定发送数据的电脑端口号——>getPort()
            如果发送端创建DatagramSocket对象时候指定了端口号(实参),返回值就一致;如果没有指定(空参),返回值就和发送端是一致的随机端口号
        • -5- 快递公司离开 —— 释放资源——>close()

      • 应用场景——聊天室——>CSDN链接 :http://t.csdnimg.cn/2uNle ——>IDEA文件:package com.itheima.a03udpdemo2;
    • 组播——老师讲课(一对多)——>一个人发消息,在教室的人(加入组播地址)才可以接收
      组播地址:224.0.0.0~239.255.255.255其中224.0.0.0~224.0.0.255 为预留的组播地址
      • 发送数据: 创建老师——>准备教材内容——>确定教室——>汇总信息——>开始讲课——>下课
        • -1- 创建老师——.创建MulticastSocket对象

          • 构造方法: MulticastSocket ms = new MulticastSocket();
            空参:获取随机的电脑IP,接收端接收的电脑IP也是随机的
            • 空参:所有可用的端口中随机一个进行使用
            • 有参:指定端口号使用(电脑的端口号)
        • -2- 准备教材内容——创建要发送的字符串 转成 字节数组

        • -3- 确定教室——指定组播地址(区域地址)


          数据发送到区域地址中,相同区域地址的接收端接收
          • 指定IP地址(InetAddress address):public static InetAddress getByName(String host)
            此时不是指定的电脑IP地址,而是组播地址(区域地址,可以让多个电脑添加)
          • 指定端口号——>port
        • -4- 汇总信息(资源包)——> 创建DatagramPacket 对象

          • 构造方法:public DatagramPacket(byte buf[], int length, InetAddress address, int port) {}
            参数:字节数组,数组长度,IP地址,程序端口号
        • -5- 开始讲课——>send()


          MulticastSocket 发送数据方法
        • -6- 下课——> close()

      • 接收数据:创建要学这一科目的学生——>获取教室信息——>到达教室——>准备接收资源包的位置和大小——>接收数据——>整理笔记——>下课
        • -1- 创建要学这一科目的学生(指定端口号)——.创建MulticastSocket对象

          • 构造方法:MulticastSocket ms = new MulticastSocket(发送程序的端口号);
        • -2- 获取教室信息——获取区域地址——创建InetAddress对象


          必须加入同一组区域地址中,才能接收到数据
          • InetAddress address = InetAddress.getByName("组播区域地址");
        • -3- 到达教室——加入这一区域地址中——>joinGroup()


          参数:InetAddress类型的IP(区域地址)
        • -4- 准备接收资源包的位置和大小——创建DatagramPacket对象

          • 构造方法:public DatagramPacket(byte buf[], int length) {}
            参数:字节数组,要用来接收数据的数组长度
        • -5- 接收数据——receive()

        • -6- 整理笔记——解析数据

          • 6.1 获取data数据类型数组——>getData();
          • 6.2 获取真实数据长度——>getLength();
          • 6.3 获取发送端的电脑IP——>getAddress().getHostAddress();
            此时返回的是真实的IP(字符串类型)。getAddress()返回的是InetAddress类型的IP
          • 6.4 获取发送端的电脑名字——>getAddress().getHostName();
          • 6.5字符数组变成字符串——new String(data,0,len);
            参数:字符数组,开始索引,截取的长度
        • -7- 下课——close()

    • 广播——公开演讲,直播——>一个人发消息,所有人都能收到。
      广播地址:255.255.255.255
      • 广播和单播实现过程一致,只是将接收端的电脑IP改为 255.255.255.255就可以

  • 2. TCP通信程序
    通信之前保证连接已经建立

    • 特点:TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生I0流来进行网络通信


      细节1:在创建对象的同时会连接服务端 如果连接不上,代码会报错
      ​细节2:IO流是在连接通道里面的。 通道方向从客户端到服务端,所以客户端是输出流,服务端是输入流
    • 发送数据:(客户端)——>Socket
      • -1- 创建客户端的Socket对象(Socket)与指定服务端连接——>Socket(String host, int port)


        创建对象的同时,通过 三次握手协议和已经在等待的服务端建立连接通道,如果连接不上(没有开启接收端),代码会报错
      • -2- 获取输出流,写数据——> Outputstream getoutputstream()


        细节:IO流是在连接通道里面的。 通道方向从客户端到服务端,所以客户端是输出流,服务端是输入流
      • -3- 释放资源——> void close()

        • 3.1关闭IO流——断开和服务端(接收端)的连接
          细节:由于IO流在通道中,所以流也可以不关闭,只要保证客户端关闭就行
        • 3.2关闭客户端(发送端)
          关闭时的协议——四次挥手协议:利用这个协议断开连接,而且保证连接通道里面的数据已经处理完毕了
    • 接收数据:(服务器)——>ServerSocket
      • -1- 创建服务器端的Socket对象(ServerSocket) ——> ServerSocket(int port)


        端口号要和指定程序的端口号一致
      • -2- 监听客户端连接,返回一个Socket对象 ——> Socket accept()


        程序运行到这,服务端会死等,直到接收到数据
      • -3- 获取输入流,读数据,并把数据显示在控制台 ——> InputStream getInputStream()


        为了方便展示,使用链式法则
        • 将链式分开:

          • 3.1 创建字节流对象,使用字节流直接接收数据,传递中文容易乱码
          • 3.2 使用转换流,将字节流转换成字符流,此时就可以读取中文
          • 3.3 使用缓冲流,用来提高字符流的效率
      • -4- 释放资源 ——> void close()

        • 4.1关闭IO流——断开和客户端(发送端)的连接
          细节:由于IO流在通道中,所以流也可以不关闭,只要保证服务端关闭就行
        • 3.2关闭服务端(接收端)
          关闭时的协议——四次挥手协议:利用这个协议断开连接,而且保证连接通道里面的数据已经处理完毕了
    • 补充知识点:
      • 1.客户端(发送) <——> 服务端(接收) 完整逻辑

      • 2. TCP通信程序(三次握手)——>确保连接

      • 3. TCP 通信程序(四次挥手)——>确保连接断开,且数据处理完毕

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值