UDP

suaxi
2020-11-23 / 0 评论 / 93 阅读 / 正在检测是否收录...

类似于发短信,不用连接,只需要知道接收端的地址

发送消息

发送端

package com.network.lesson03;

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

/**
 * @Author suaxi
 * @Date 2020/11/23 11:03
 * UDP发送消息,不需要连接服务器
 */
public class UpdClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1、建立一个socket
        DatagramSocket datagramSocket = new DatagramSocket();
        //2、建立包
        String mgs = "故乡的樱花开了!";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 8888;
        //数据    数据的长度起始     要发送给谁
        DatagramPacket datagramPacket = new DatagramPacket(mgs.getBytes(), 0, mgs.length(),localhost,port);
        //3、发送包
        datagramSocket.send(datagramPacket);
        //4、关闭流
        datagramSocket.close();
    }
}

接收端

package com.network.lesson03;

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

/**
 * @Author suaxi
 * @Date 2020/11/23 11:18
 * UDP接收端,还是要等待客户端的连接
 */
public class UpdServerDemo01 {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        //接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);

        datagramSocket.receive(datagramPacket); //阻塞接收

        System.out.println(datagramPacket.getAddress().getHostAddress()); //接收地址
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength())); //数据包消息

        //关闭连接
        datagramSocket.close();
    }
}
循环发送消息
package com.network.chat;

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

/**
 * @Author suaxi
 * @Date 2020/11/23 11:34
 * 发送消息
 */
public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket datagramSocket = new DatagramSocket(8888);

        //准备数据,控制台读取输入的数据System.in
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            String data = bufferedReader.readLine();
            byte[] bytes = data.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 8889));

            datagramSocket.send(packet);
            if (data.equals("bye")){
                break;
            }
        }
        datagramSocket.close();
    }
}
package com.network.chat;

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

/**
 * @Author suaxi
 * @Date 2020/11/23 11:34
 * UDP聊天咨询Demo(循环接收)
 */
public class UdpReciverDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket datagramSocket = new DatagramSocket(8889);

        while (true){
            //准备接收包裹
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
            datagramSocket.receive(datagramPacket); //阻塞式接收包裹

            byte[] data = datagramPacket.getData();
            String reciveData = new String(data, 0, data.length);
            System.out.println(reciveData);

            //断开连接
            if (reciveData.equals("bye")){
                break;
            }
        }
        datagramSocket.close();
    }
}
在线咨询,两者都是发送方,也都可以是接收方

发送端

package com.network.chat;

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

/**
 * @Author suaxi
 * @Date 2020/11/23 14:37
 */
public class TalkSend implements Runnable{

    DatagramSocket datagramSocket = null;
    BufferedReader bufferedReader = null;

    private int fromPort;
    private String toIP;
    private int toPort;

    public TalkSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            datagramSocket = new DatagramSocket(fromPort);
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true){
            try {
                String data = bufferedReader.readLine();
                byte[] bytes = data.getBytes();
                DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIP, this.toPort));

                datagramSocket.send(packet);
                if (data.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        datagramSocket.close();
    }
}

接收端

package com.network.chat;

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

/**
 * @Author suaxi
 * @Date 2020/11/23 14:43
 */
public class TalkRecive implements Runnable{
    DatagramSocket datagramSocket = null;
    private int port;
    private String mgsFrom;

    public TalkRecive(int port,String mgsFrom) {
        this.port = port;
        this.mgsFrom = mgsFrom;
        try {
            datagramSocket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {


        while (true){
            try {
                //准备接收包裹
                byte[] bytes = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
                datagramSocket.receive(datagramPacket); //阻塞式接收包裹

                byte[] data = datagramPacket.getData();
                String reciveData = new String(data, 0, data.length);
                System.out.println(mgsFrom+":"+reciveData);

                //断开连接
                if (reciveData.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        datagramSocket.close();
    }
}

具体实现:

package com.network.chat;

/**
 * @Author suaxi
 * @Date 2020/11/23 14:46
 */
public class TalkStudent {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TalkSend(7777,"localhost",8888)).start();
        new Thread(new TalkRecive(9999,"老师")).start();
    }
}

TalkStudent.png

package com.network.chat;

/**
 * @Author suaxi
 * @Date 2020/11/23 14:48
 */
public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(7778,"localhost",9999)).start();
        new Thread(new TalkRecive(8888,"学生")).start();
    }
}

TalkTeacher.png

0

评论 (0)

取消