一,发送器代码

package net.ittimeline.java.network.socket.udp.talk;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

/**
 * 发送端
 */
public class TalkSend implements Runnable {
    private DatagramSocket client;
    private int port;
    private String toIp;
    private int toPort;
    private BufferedReader reader;
    private String msg;
    private byte[] datas;
    private DatagramPacket packet;
    public TalkSend(int port, String toIp, int toPort) {
        this.port = port;
        this.toIp = toIp;
        this.toPort = toPort;
        try {
            this.client = new DatagramSocket(port);
            this.reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while (true){
            if(null == this.client || null == this.reader){
                break;
            }
            try {
                this.msg = this.reader.readLine();
                this.datas = this.msg.getBytes();
                packet = new DatagramPacket(
                        this.datas,
                        0,
                        this.datas.length,
                        new InetSocketAddress(this.toIp, this.toPort)
                );
                this.client.send(packet);
                if(this.msg.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        if(null != this.client){
            this.client.close();
        }
    }
}

二,  接收器代码

package net.ittimeline.java.network.socket.udp.talk;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 接收端
 */
public class TalkReceive implements Runnable{
    private DatagramSocket server;
    private int port;
    private byte[] container;
    private byte[] datas;
    private int len;
    private String msg;
    private DatagramPacket packet;
    public TalkReceive(int port){
        this.port = port;
        try {
            this.server = new DatagramSocket(port);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while(true){
            if(null == this.server){
                break;
            }
            this.container = new byte[1024 * 60];
            this.packet = new DatagramPacket(this.container,0,this.container.length);
            try {
                this.server.receive(this.packet);
                this.datas = this.packet.getData();
                this.len = this.packet.getLength();
                this.msg = new String(this.datas, 0, this.len);
                System.out.println(this.msg);
                if(this.msg.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(null != this.server){
            this.server.close();
        }
    }
}

三,调用

1, 场景

实现老师与学生间的聊天

2,老师代码

package net.ittimeline.java.network.socket.udp.talk;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkReceive(9999)).start();//接收
        new Thread(new TalkSend(4444,"localhost",8888)).start();//发送
    }
}

3, 学生代码

package net.ittimeline.java.network.socket.udp.talk;

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777, "localhost",9999)).start();//发送
        new Thread(new TalkReceive(8888)).start();
    }
}

4, 结果

Java之UDP端到端通讯基础_udp