• Java连载129-广播数据包、网络编程总结


    一、广播数据包

    1.特性

    • 这种通信类似于广播,要想实现这个功能,需要使用特殊的IP地址,要想实现多播或者广播通信的主机必须加入一个D类地址,D类地址的十进制表示范围为224.0.0.0~239.255.255.255
    • 需要使用的类是`java.net.MulticastSocket.
    • 常用的构建方法
      (1)MulticastSocket(int port) throws IOException
      创建一个多播套接字,并将其绑定到端口上。
      (2)MuticastSocket(SocketAddress bindaddr) throws IOException
      创建一个多播套接字,并将其绑定到一个指定套接字地址上。
    • 常用的成员方法:
      (1)public void joinGroup(InetAddress mcastaddr)
      将多播套接字加入指定多播组。
      (2)public void leaveGroup(InetAddress mcastaddr)
      将多播套接字移出多播组。
      (3)public void setTimeToLive(int ttl) throws IOException
      设置在此MuticastSocket上发出的多播数据包的默认生存时间。
    • ttl参数设置数据包最多可以跨过多少个网络:
      (1)ttl=0,数据包应该停留在本地主机;
      (2)ttl=1,数据包应该发送到本地局域网;
      (3)ttl=32,数据包应该发送到本站点的网络上;
      (4)ttl=64,数据包应该保留在本地区;
      (5)ttl=128,数据包应该保留在本大洲;
      (6)ttl=255,数据包应该可以发送到所有地方。
    • 先写一个发送端
    package com.bjpowernode.java_learning;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    
    public class D129_1_BroadcastTest {
     public static void main(String[] args) {
      new D129_Broadcast().send();
     }
    }
    class D129_Broadcast {
     public void send() {
      String msg = "Hello,This is Broadcast Message";         //多播内容
      int port = 6666;
      InetAddress group = null;
      MulticastSocket ms = null;
      
      try {
       group = InetAddress.getByName("224.1.1.1");         //创建多播地址
       ms = new MulticastSocket(port);                     //创建多播套接字
       ms.joinGroup(group);                                //将套接字加入多播地址
       ms.setTimeToLive(1);                                //设置数据报发送范围为本地
       DatagramPacket dp = new DatagramPacket(msg.getBytes(),msg.length(),group,port);//创建待发送的数据报
       ms.send(dp);                                        //发送数据报
      }catch(IOException e) {
       System.out.println(e);
      }finally {
       ms.close();                                         //关闭套接字
      }
      
     }
    }
    • 再写一个接收端的程序
    package com.bjpowernode.java_learning;
    
    import java.net.DatagramPacket;
    
    public class D129_2_ReceiverTest {
     public static void main(String[] args) {
      new D129Receiver().receive();
     }
    }
    class D129Receiver{
     public void receive() {
      byte[] data = new byte[1024];                //数据缓存区
      int port = 6666;                             //多播端口号
      InetAddress group = null;
      MuticastSocket ms = null;
      
      try {
       group = InetAddress.getName("224.1.1.1"); //创建多播地址
       ms = new MulticastSocket(port);           //创建多播套接字
       ms.joinGroup(group);                      //将套接字加入到多播地址
       DatagramPacket dp = new DatagramPacket(data,data,length,group,port);
                   //创建待接收的数据报
       ms.receive(dp);                           //接收数据报
       String msg = new String(dp.getData(),0,dp.getLength());
       System.out.println("接收到的数据广播数据为:"+msg);
       
       
      }catch(IOException e) {
       System.out.println(e);
      }finally {
       ms.close();                               //关闭套接字
      }
     }
    }
    • 首先是运行接收端,然后运行广播端,广播将发送“Hello,This is Broadcast Message",客户端收到该消息后会将其打印出来。 129.1

    总结:
    (1)TCP和UDP之间的区别有哪些? TCP是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,保证传输过去的数据不会出现丢失或者乱序的情况。
    UDP是无连接的数据服务,不对数据的完整性进行检查与修改,无需等待对方应答,会出现分组丢失,重复,乱序的情况,但传输效率高,实时性很好,适用于局域网内部传输。报文协议头简单。
    (2)Socket的网络编程过程简述
    首先是客户端,首先创建一个Socket实例,利用构造方法,绑定要通信的地址和端口,然后通过套接字的I/O流进行通信,最后通信接收,调用成员方法close()来关闭Socket;
    然后是服务器端,首先建立一个ServerSocket实例,并使用构造方法来绑定本地IP地址以及端口号,用于监听将会收到的TCP请求。然后做如下循环:调用成员方法accept()来获取客户端的连接,并且返回一个Socekt实例。为返回的Socket实例创建一个线程,并且使用返回的Socket实力的IO流与客户端通信;最后使用成员方法进行关闭。

    三、源码:

      • D129_1_BroadcastTest.java
      • D129_2_ReceiverTest.java
      • https://github.com/ruigege66/Java/blob/master/D129_1_BroadcastTest.java
      • https://github.com/ruigege66/Java/blob/master/D129_2_ReceiverTest.java
      • CSDN:https://blog.csdn.net/weixin_44630050
      • 博客园:https://www.cnblogs.com/ruigege0000/
      • 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流,后台回复“礼包”获取Java大数据学习视频礼包
        127.59
  • 相关阅读:
    自动化运维工具Ansible实战Playbooks剧本使用
    Mysql5.6.x版本半同步主从复制的开启方法
    mysql数据库的一些基本概念
    mysql之视图
    mysql之索引
    机器学习笔记09-----决策树与随机森林1---决策树概述
    机器学习笔记08-----回归2
    Anaconda 利用conda安装第3方包
    机器学习笔记07-----回归1
    使用navicat导出数据库字典
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/13289449.html
Copyright © 2020-2023  润新知