zoukankan      html  css  js  c++  java
  • JavaSE——UDP协议网络编程(二)

    在 UDP 网络编程中,发送方与接收方没有建立联系,没有明显的服务器端和客户端的区别。

    • 类 DatagramSocket:

    此类表示用来发送和接收数据报包的套接字。

    主要的构造方法:

    DatagramSocket():创建实例,绑定本机的默认IP地址,随机选择端口。通常用于客户端编程,没有特定监听的端口,仅仅使用一个临时的。 
    DatagramSocket(int port):创建实例,指定端口号,即固定监听Port端口的报文。 
    DatagramSocket(int port, InetAddress localAddr):制定IP地址和端口号。当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

    常用方法:

    receive(DatagramPacket d):接收数据报文到d中。
    send(DatagramPacket d):发送报文d到目的地。 
    setSoTimeout(int timeout):设置超时时间,单位为毫秒。 
    close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Sock

    • DatagramPacket:

    用于处理报文,将byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成byte数组。 

    主要构造方法:

    DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从buf数组中,取出length长的数据创建数据包对象,目标是addr地址,port端口。 
    DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从buf数组中,取出offset开始的、length长的数据创建数据包对象,目标是addr地址,port端口。 
    DatagramPacket(byte[] buf, int offset, int length):将数据包中从offset开始、length长的数据装进buf数组。
    DatagramPacket(byte[] buf, int length):将数据包中length长的数据装进buf数组。

    常用方法:

    getData():它从实例中取得报文的byte数组编码。 

    • UDP协议数据报的发送和接受

    发送端:
    1.建立udpsocket服务端点。该端点建立,系统会随机分配一个端口。如果不想随机配置,可以手动指定。 DatagramSocket ds = new DatagramSocket(9999);此处制定端口为 9999,这个端口号是发送端的端口号。

    2. 将数据进行packet包的封装,必须要指定目的地址和端口。  byte[] buf = "hello,客户端".getBytes(); DatagramPacket dp =new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.1"),9999);

    3. 通过socket服务的send方法将该包发出。 ds.send(dp);

    4. 将socket服务关闭。主要是关闭资源。 ds.close();

    接收端:
    1. 建立udp的socket服务。要监听一个端口。 DatagramSocket ds = new DatagramSocket(9999);
    2. 定义一个缓冲区,将该缓冲区封装到packet包中。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length);
    3. 通过socket的receive方法将数据存入数据包中。 ds.receive(dp);receive方法产生一个“阻塞”。
    4. 通过数据包dp的方法getData()、getAddress()、getPort()等方法获取包中的指定信息。
    5. 关闭socket。 ds.close();

    注意:1.在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。 

    2.“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。 

    • 系统实现:

    • 代码实现:

    接收端:

    public class Server {
    
        public static void main(String[] args) throws IOException {
            //绑定本机IP,指定端口号为 9999.
            DatagramSocket server = new DatagramSocket(9999);
            //准备字节数组,大小可容纳1024个字节开始接收数据。
            byte[] bytes = new byte[1024];
            //将字节数组中的前1024个字节封装进 packet 中。
            DatagramPacket packet = new DatagramPacket(bytes,1024);
            //通过socket的 receive()方法将数据存入数据包中。
            server.receive(packet);
            //将服务器端接收到的数据打印出来,此时的数据已经解析成了原始的数据并且是实际接收到的长度
            String Msg = new String(packet.getData(),0,packet.getLength()); 
            System.out.println("服务器端接收到的消息" + Msg);
    
        }
    
    }

    发送端:

    public class Client {
    
        public static void main(String[] args) throws IOException {
            //绑定本机端口号,随机选择一个端口号
            @SuppressWarnings("resource")
            DatagramSocket client = new DatagramSocket();
            //向服务器端发送数据
            String str = "Hello,I'm client";
            //以字节形式发送
            byte[] bytes = str.getBytes();
            //将字节信息封装在 packet 中以待发送。注意此时要获得的参数有字节数组中从0 到结束的所有字节,接收端的IP地址和端口号。
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("127.0.0.1"),9999);
            //发送
            client.send(packet);
        }
    
    }

    output:

    注意,UDP通信过程中发段和收端不需要建立连接,主要通过 send()和receive()方法来发送和接受数据,并且发送和接收的数据均以 packet 为载体,发送的时候,packet 的参数应该有接收方的 IP地址(通过InetAddress.getByName()来获取)和端口号。

     如有不对之处,还望指正,谢谢(●'◡'●)

  • 相关阅读:
    二、推导式/自省
    一、Python编码规范(PEP 8)/工程结构化
    十、持续集成(Jenkins+Ant+Jmeter)
    九、Jmeter之逻辑控制器
    八、Jmeter分布式测试
    七、ServerAgent监控服务器资源
    六、场景设计/报告分析
    五、集合点/断言/关联
    .html页面引入vue并使用公共组件
    vue.js页面刷新出现闪烁问题的解决
  • 原文地址:https://www.cnblogs.com/linlin0/p/6291231.html
Copyright © 2011-2022 走看看