zoukankan      html  css  js  c++  java
  • Java连载128-UDP通信编程

    一、UDP编程

    1.DatagramPacket特性以及构造方法

    • UDP是一个面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。
    • Datagram类就相当于一个集装箱用于封装UDP通信中发送或者接收的数据。
    • 构造方法:
      (1)DatagramPacket(byte[] buf,int length)
      使用该构造方法在创建DatagramPacket对象的时候指定了封装对象的字节数组和数据大小,没有指定IP和端口号。这样的对象只能用于接收端而不能用于发送端。因为发送端一定要明确指出数据的目的地(IP地址和端口号),而接收端不需要明确数据的来源,只需要接收到数据即可。
      (2)DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
      使用该构造方法在创建对象的时候指定了IP地址和端口号,通常用于发送端。
      (3)DatagramPacket(byte[] buf,int offset,int length)
      用于接收端,offset该参数用于指定接收到的数据放在buf缓冲数组时是从offset开始的。
      (4)DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port)
      结合(2)(3)就能看懂了

    2.DatagramPacket常用方法

    (1)InetAddress getAddress()
    返回发送端或者接收端的IP地址,得看在哪一端。
    (2)int getPort()
    返回发送端或者接收端的端口号。
    (3)bytep[] getData()
    返回将要接收或者发送的数据。
    (4)int getLength()
    返回将要接收或者发送的数据的长度。

    二、DatagramSocket

    • DatagramPacket就是数据包,DatagramSocket可以认为是运送数据包的“码头”

    1.构造方法详解

    (1)DatagramSocket()
    该构造方法用于创建发送端的DatagramSocket对象,没有指定端口,系统会自动分配一个。
    (2)DatagramSocket(int port)
    既可以用于发送端又可以用于接收端。在用于接收端的时候必须指定端口号,这样才能监听端口。
    (3)DatagramSocket(int port,InetAddress addr)
    该对象适用于计算机上有多块网卡的情形,使用时可以明确规定数据通过哪块网卡向外发送和接收 哪块网卡的数据。由于计算机中针对不同的网卡分配不同的IP地址,因此在创建对象的时候需要指定IP地址。

    2.常用的成员方法

    (1)void receive(DatagramPacket p)
    将接受到的数据填充到DatagramPacket数据包中,在接收到数据之前会一直处于阻塞状态,只有当接收到数据包的时,该方法才会返回。
    (2)void send(DatagramPacket p)
    放送DatagramPacket数据包,发送的数据包中包含将要发送的数据,数据的长度,远程主机的IP地址和端口号。
    (3)void close
    关闭当前的Socket,通知驱动程序释放为这个Socket保留的资源。

    3.直接举例UDP编程实例

    package com.bjpowernode.java_learning;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class D128_1_ServerTest {
     public static void main(String[] args) {
      DatagramSocket socket = null;
      DatagramPacket packet_send = null;
      DatagramPacket packet_receive = null;
      int port = 5151;                                 //服务器监听端口号
      try {
       socket = new DatagramSocket(port);           //创建连接对象
       System.out.println("服务器启动");        
       byte[] r = new byte[1024];                   //创建缓存数组
       packet_receive = new DatagramPacket(r,r.length);//创建数据包对象
       socket.receive(packet_receive);              //接收数据包
       InetAddress client_ip = packet_receive.getAddress();//客户端地址
       int client_port = packet_receive.getPort();          //客户端的端口号
       byte[] data = packet_receive.getData();      //客户端字节数据
       int len = packet_receive.getLength();        //数据有效长度
       String str1 = new String(data,0,len);        //将字节数据转换为字符串
       System.out.println("客户机"+client_ip+":"+client_port+"
    发送的信息是:"+str1);
       String response = "Hello,I am Server B";
       byte[] s = response.getBytes();
       packet_send = new DatagramPacket(s,s.length,client_ip,client_port);//创建响应数据包对象
       socket.send(packet_send);
      }catch(Exception e) {
       System.out.println(e);
      }finally {
       socket.close();
      }
     }
    
    }
     
    • 我们先运行这个服务器端
    • 128.1
    package com.bjpowernode.java_learning;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class D128_2_ClientTest {
     public static void main(String[] args) {
      DatagramSocket socket = null;
      DatagramPacket packet_send = null;
      DatagramPacket packet_receive = null;
      String server = "127.0.0.1";                               //服务器IP地址
      int port = 5151;                                           //服务器端口号
      String str = "Hello,I am Client A";
      byte[] data = str.getBytes();                               //将要发送的信息转换为字节数组
      try {
       socket = new DatagramSocket();                         //创建连接socket对象
       InetAddress addr = InetAddress.getByName(server);      //将服务器端的IP地址封装成InetAddress对象
       packet_send = new DatagramPacket(data,data.length,addr,port);//创建数据包对象
       socket.send(packet_send);                              //向服务器发送数据
       byte[] r = new byte[1024];                             //设置缓冲区
       packet_receive = new DatagramPacket(data,data.length,addr,port);//创建数据包对象
       socket.receive(packet_receive);                        //接收数据包
       byte[] response = packet_receive.getData();            //读取数据包中的数据信息
       int len = packet_receive.getLength();                  //读取数据长度
       String str1 = new String(response,0,len);              //将字节数据转换成字符串
       System.out.println("服务器响应的信息是:"+str1);  
      }catch(Exception e) {
       System.out.println(e);
      }finally {
       socket.close();
      }
     }
    
    }
     
    • 接下里运行客户端程序
    • 128.2

    三、源码:

    • D128_1_ServerTest.java
    • D128_2_ClientTest.java
    • https://github.com/ruigege66/Java/blob/master/D128_1_ServerTest.java
    • https://github.com/ruigege66/Java/blob/master/D128_2_ClientTest.java
    • CSDN:https://blog.csdn.net/weixin_44630050
    • 博客园:https://www.cnblogs.com/ruigege0000/
    • 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流,后台回复“礼包”获取Java大数据学习视频礼包
    • 127.59
  • 相关阅读:
    mysql的安全漏洞的一种现象,就是利用转义字符把 ' ' 化没了,然后true 起作用啦
    maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
    mysql中的update(更新)与alter(更改)以及 change和modify的区别
    多线程:(充分利用定义任务后,开启多线程实现任务的理解)题目:模拟三个老师同时给50个小朋友发苹果,每个老师相当于一个线程。
    swing更改组件(删除后添加)得到心得:起码得刷新一下啊,可能还得再考虑重绘
    IE设置主页一直无果,尝试了右键软件看目标路径后缀无效,注册表也无效,最后在电脑管家里的工具浏览器保护搞定
    封装的localstorge的插件,store.js
    jquery.cookie用法详细解析,封装的操作cookie的库有jquery.cookie.js
    localstroge可以在页面间传递数值;
    移动开发阻止默认事件,1默认长按复制2拖动时页面默认移动
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/13270181.html
Copyright © 2011-2022 走看看