zoukankan      html  css  js  c++  java
  • DatagramSocket例子

    在javaSE中,使用DatagramSocket进行的网络通信是基于UDP的。

    DatagramSocket类:

    表示发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

    构造方法:(多个只说一个)

    DatagramSocket(int port)
        创建数据报套接字并将其绑定到本地主机上的指定端口。

    重要方法:

    public void send(DatagramPacket p)    throws IOException
    解释:从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 如果存在安全管理器,且套接字当前没有连接到远程地址,则此方法首先执行某些安全性检查。

    public void receive(DatagramPacket p)   throws IOException
    解释:从此套接字接收数据报包。当此方法返回时,DatagramPacket的缓冲区填充了接收的数据。数据报包也包含发送方的IP地址和发送方机器上的端口号。
    此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。如果存在安全管理器,而安全管理器的 checkAccept方法不允许接收操作,则包不能被接收。

    DatagramPacket类:

    表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。

    构造方法:(有区分用于接收或发送的)

    接受

    DatagramPacket(byte[] buf, int length)
        构造 DatagramPacket,用来接收长度为 length 的数据包。

    DatagramPacket(byte[] buf, int offset, int length)
        构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。

    发送(多个只说一个)

    DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
        构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。

    重要方法:

    public byte[] getData()
    返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续length长度。

    如何通信:

    发送方工作过程步骤:

    1. 创建DatagramSocket(可以设置本地端口,或由系统分配)
    2. 创建用于发送的DatagramPacket(主要设置发送的数据、远程地址和端口等信息)
    3. 通过DatagramSocket发送DatagramPacket(调用send方法)
    4. 关闭DatagramSocket

    接收方工作过程步骤:

    1. 创建DatagramSocket(主要设置本地地址和端口等信息)
    2. 创建用于接受的DatagramPacket(不需要设置地址和端口)
    3. 通过DatagramSocket接收发送方信息,填充DatagramPacket(调用receive方法)
    4. 读取DatagramPacket的数据(调用getData方法)
    5. 关闭DatagramSocket

    例子

    发送方代码:

    View Code
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class Sender {
    
        public static void main(String[] args) throws Exception {
            DatagramSocket sender = new DatagramSocket();// 1、创建DatagramSocket(可以设置本地端口,或由系统分配)
            String msg = "你好!";
            byte[] buf = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(buf, buf.length,
                    InetAddress.getByName("127.0.0.1"), 10000);// 2、创建用于发送的DatagramPacket(主要设置发送的数据、远程地址和端口等信息)
            System.out.println("sender:发送信息----" + msg);
            sender.send(packet);// 3、通过DatagramSocket发送DatagramPacket
            System.out.println("sender:已经发送了信息");
            sender.close();// 4、关闭DatagramSocket
        }
    
    }

    接收方代码:

    View Code
     1 import java.net.DatagramPacket;
     2 import java.net.DatagramSocket;
     3 
     4 public class Receiver {
     5 
     6     public static void main(String[] args) throws Exception {
     7         DatagramSocket receiver = new DatagramSocket(10000);// 1、创建DatagramSocket(主要设置本地地址和端口等信息)
     8         byte[] buf = new byte[1024];
     9         DatagramPacket packet = new DatagramPacket(buf, buf.length);// 2、创建用于接受的DatagramPacket(不需要设置地址和端口)
    10         System.out.println("receiver:等待接收");
    11         receiver.receive(packet);// 3、通过DatagramSocket接受发送方信息,填充DatagramPacket
    12         String msg = new String(packet.getData(), 0, packet.getLength());// 4、读取DatagramPacket的数据
    13         System.out.println("receiver:得到的信息是:-----" + msg);
    14         receiver.close();// 5、关闭DatagramSocket
    15     }
    16 
    17 }
  • 相关阅读:
    5.14每日一题题解
    5.13 每日一题题解
    5.12 每日一题题解
    5.11 每日一题题解
    5.10每日一题题解
    【SPOJ -NSUBSTR】Substrings 【后缀自动机+dp】
    【POJ1509】Glass Beads 【后缀自动机】
    【codevs3160】 LCS 【后缀自动机】
    【HDU4734】F(x) 【数位dp】
    【hdu6148】Valley Numer【数位dp模板题】
  • 原文地址:https://www.cnblogs.com/dann/p/2743884.html
Copyright © 2011-2022 走看看