发送Send

  • 创建DatagramSocket, 随机端口号,也可以指定端口号
  • 创建DatagramPacket, 指定数据, 长度, 地址, 端口
  • 使用DatagramSocket发送DatagramPacket
  • 关闭DatagramSocket

    接收Receive

  • 创建DatagramSocket, 指定端口号

  • 创建DatagramPacket, 指定数组, 长度
  • 使用DatagramSocket接收DatagramPacket
  • 关闭DatagramSocket
  • 从DatagramPacket中获取数据

    接收方获取ip和端口号

  • String ip = packet.getAddress().getHostAddress();

  • int port = packet.getPort();

    UDP传输

    ```java package cn.giteasy.socket;

import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;

/*

  • UDP传输之Send(发送) *
  • 创建DatagramSocket, 随机端口号
  • 创建DatagramPacket, 指定数据, 长度, 地址, 端口
  • 使用DatagramSocket发送DatagramPacket
  • 关闭DatagramSocket */ public class Demo01Send {
  1. public static void main(String[] args) throws Exception {
  2. //要发送的数据
  3. String str = "how are you?";
  4. //接收消息的主机
  5. String host = "localhost";
  6. //接收数据的程序端口号
  7. int port = 8888;
  8. //创建Socket,使用随机端口,也可以构造方法中传入端口
  9. DatagramSocket socket = new DatagramSocket();
  10. //创建Packet,用于存放数据
  11. DatagramPacket packet =
  12. new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(host), port);
  13. //发送
  14. socket.send(packet);
  15. //关闭socket
  16. socket.close();
  17. }

}

```java
package cn.giteasy.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
 *    UDP传输之Receive(接收)
 *         创建DatagramSocket, 指定端口号
 *         创建DatagramPacket, 指定数组, 长度
 *         使用DatagramSocket接收DatagramPacket
 *         关闭DatagramSocket
 *         从DatagramPacket中获取数据
 */
public class Demo01Receive {
    public static void main(String[] args) throws Exception {

        //当前接收端程序监听的端口
        int port = 8888;

        //创建Socket相当于创建码头,需指定端口号用于接收数据
        DatagramSocket socket = new DatagramSocket(port);
        //创建Packet,存放接收到的数据
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);

        //阻塞:接收数据
        socket.receive(packet);

        //从Packet中获取数据
        byte[] arr = packet.getData();
        //获取有效的字节个数
        int len = packet.getLength();
        System.out.println(new String(arr,0,len));
        socket.close();
    }

}

UDP传输优化

可不间断发送消息和接收消息

package cn.giteasy.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * 可持续发送,用户输入的数据
 */
public class Demo02Send {


    public static void main(String[] args) throws Exception {
        String host = "localhost";
        int port = 8888;
        DatagramSocket socket = new DatagramSocket();

        Scanner scanner = new Scanner(System.in);

        while (true){
            String str = scanner.nextLine();
            if("exit".equals(str)){
                break;
            }

            DatagramPacket packet =
                    new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(host), port);
            socket.send(packet);
        }

        socket.close();
    }

}
package cn.giteasy.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 可持续接收发送端的消息
 */
public class Demo02Receive {

    public static void main(String[] args) throws Exception {
            int port = 8888;
            DatagramSocket socket = new DatagramSocket(port);
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
            while(true){
                socket.receive(packet);
                byte[] arr = packet.getData();
                int len = packet.getLength();
                String hostAddress = packet.getAddress().getHostAddress();
                int sendPort = packet.getPort();
                System.out.println(hostAddress+":" + sendPort + " => " +new String(arr,0,len));
            }
    }

}

UDP传输多线程

使用多线程实现:发送和接收在同一进程内进行


class Send extends Thread {

    private String host;
    private int port;

    Send(String host,int port){
        this.host = host;
        this.port = port;
    }



    @Override
    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket();
            Scanner scanner = new Scanner(System.in);
            while (true){
                System.out.print(host + ":" + port + " <= 请输入要发送的消息:");
                String str = scanner.nextLine();
                if("exit".equals(str)){
                    break;
                }

                DatagramPacket packet =
                        new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName(host), port);
                socket.send(packet);

                try {
                    //等待接收端打印完成,最好的办法是使用线程间通信实现,wait 和 notify
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            socket.close();
        }  catch (IOException e) {

            e.printStackTrace();
        }        
    }
}

class Receive extends Thread {

    private int port;

    Receive(int port){
        this.port = port;
    }
    @Override
    public void run() {
        try {

            DatagramSocket socket = new DatagramSocket(port);
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
            while(true){
                socket.receive(packet);
                byte[] arr = packet.getData();
                int len = packet.getLength();
                String hostAddress = packet.getAddress().getHostAddress();
                int sendPort = packet.getPort();
                System.out.println(hostAddress+":" + sendPort + " => " +new String(arr,0,len));
            }
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
}
/**
 * 使用多线程实现:发送和接收在同一进程内进行
 */
public class Demo03SendAndReceive {


    public static void main(String[] args) {
        //接收端线程
        Receive receive = new Receive(8888);
        //发送端线程
        Send send = new Send("localhost", 8888);

        receive.start();
        send.start();

    }

}