zoukankan      html  css  js  c++  java
  • Java UDP的简单实例以及知识点简述

    UDP的实现

      Java中实现UDP协议的两个类,分别是DatagramPacket数据包类以及DatagramSocket套接字类

      其与TCP协议实现不同的是:

      UDP的套接字DatagramSocket相比于Socket、ServerSocket来说,是一个非常简单的概念,没有连接的含义。套接字只需要知道侦听和发送数据包的本地端口即可

      也就是在TCP协议中庸Socket类和ServerSocket类进行功能划分,UDP协议中只用一个数据包套接字DatagramSocket发送和接受数据即可。

      发送和接收数据、地址和端口都封装在数据包类DatagramPacket中。


    DatagramPacket类

      构造函数:

    public DatagramPacket(byte[] buf,int length);
    /*offset为buf缓冲区的偏移量*/
    public DatagramPacket(byte[] buf,int offset,int length);
    /*address表示目的地址    port表示目的端口*/
    public DatagramPacket(byte[] buf,int offset,int length,InetAdress address, int port)

     常用方法:

    /*返回接受数据包的主机IP地址,通常用于获取接受到数据包的发送主机IP*/
    public InetAdress    getAdress();
    /*返回数据包的主机端口号*/
    public int getPort();
    /*返回被接收或发送的缓冲区数据*/
    public byte[] getData();
    /*设置返回发出数据包的主机IP地址*/
    public void setAdress(InetAdress iaddr);
    /*设置要将此数据包发往远程主机上的端口号*/
    public void setPort(int iport);

    DatagramSocket类

      对于数据包套接字DatagramSocket来说,它只是发送或接收数据包的端口,不需要考虑链接。因此在客户端和服务器端都需要建立一个DatagramSocket对象,然后通过receive()方法接受数据包,通过send()方法发送数据包。


    端口相关对照


    UDP网络应用实例

    客户端发送1-26数字给服务器端;

    服务器端返回对应的A-Z给客户端。

    客户端程序:

    package web;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;
    
    public class UDPCilent {
        public static void main(String[] args) {
            try {
                /*UDP Cilent SEND*/
                DatagramSocket socket=new DatagramSocket();
                System.out.println("UDP Cilent Start...");
                System.out.println("Enter 1 to 26 ,Server Will Return U A to Z:");
                String info=new Scanner(System.in).next();
                socket.send(new DatagramPacket(info.getBytes(), info.length(),InetAddress.getByName("127.0.0.1"),3000));
                System.out.println("UDP Cilent Send Message...");
                
                
                byte[] rec=new byte[1024];
                DatagramPacket recivepacket=new DatagramPacket(rec, rec.length);
                socket.receive(recivepacket);
                System.out.println("Receive");
                
                String reciveData=new String(recivepacket.getData(),0,recivepacket.getLength());
                System.out.println("Receive from"+recivepacket.getAddress().getHostAddress()+":"+reciveData);
                
                
                socket.close();
                System.out.println("UDP Cilent close...");
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }

    服务端程序

    package web;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class UDPServer {
        
        public static void main(String[] args) {
            try {
                
                /*UDP Receive Message*/
                DatagramSocket socket=new DatagramSocket(3000);
                byte []bf=new byte[1024];
                DatagramPacket packet=new DatagramPacket(bf, 1024);
                System.out.println("UDP Server Start... Wait to Receive Message...");
                
                socket.receive(packet);
                String info=new String(packet.getData(),0,packet.getLength())+"from"+packet.getAddress().getHostAddress()+":"+packet.getPort();
                System.out.println(info);
                
                /*feedback*/
                InetAddress address= packet.getAddress();
                int port=packet.getPort();
                String str=new String(packet.getData(),0,packet.getLength());
                int renum=Integer.parseInt(str);
                int feedback='A';
                for(int i=1;i<=26;i++)
                {
                    if(renum==i){
                        feedback=feedback+(i-1);
                    }
                }
                char back=(char) feedback;
                String fbString=back+"";
                byte[] fstr=fbString.getBytes();
                DatagramPacket feed= new DatagramPacket(fstr,fstr.length,address,port);
                
                socket.send(feed);
                socket.close();
                System.out.println("UDP Server close...");
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        
    }

    作者:Rekent
    出处:http://www.cnblogs.com/rekent/
    本文版权归作者和博客园共有,欢迎转载、点赞,但未经作者同意必须保留此段申明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    华为云薛浩:媒体业务进入全面云化时代,云原生成为必然选择
    Python 绑定:从 Python 调用 C 或 C++
    不藏了,这些Java反射用法总结都告诉你们
    云图说|华为HiLens云上管理平台 花样管理多种端侧设备
    论文解读丨图神经网络应用于半结构化文档的命名实体识别和关系提取
    动手实操丨基于随机森林算法进行硬盘故障预测
    教你几招HASH表查找的方法
    MindSpore模型精度调优实战:如何更快定位精度问题
    云图说|应用魔方AppCube:揭秘码农防脱神器
    java算法易筋经:常见java-API使用技巧
  • 原文地址:https://www.cnblogs.com/rekent/p/6934757.html
Copyright © 2011-2022 走看看