Java 网络编程 UDP协议 聊天小项目的实现教程和代码.

一、了解UDP协议 (User Datagram Protocol)

不同于TCP协议,UDP协议不需要“三次握手”,
只需要对方的地址和开放的端口即可,
点击查看TCP 和 UDP的具体区别

二、小项目:在本机上同步访问对方端口,来模拟聊天。

1.主要类的作用:UDP 主要类 DatagramSocket(创建数据套接字),DatagramPacket(创建数据包)

  1. 创建端口:DatagramSockert (int port) 的构造方法可以开启一个 prot 接口,
  2. 发送数据:datagramSocket.send(DatagramPackeet datagramPacket) 会发送datagramPacket的数据,到构造datagramPacket 的 对方地址和对方端口 里。
  3. 接受数据 :datagramSock.receive(DatagramPackeet datagramPacket) 无数据阻塞代码执行处于监听状态,如有数据会接受数据到对象datagramPacket里面因此构造DatagramPacket的方法不同,用处也不同,
  4. datagramSocket.close() 会关闭 socket网络流.

2.思路分析zhuang

  1. 发送数据 和 接受数据 都需要 个开一个 端口,所以要用2 个DatagramSocket 来实现
  2. 因为要同时具备发送数据 和 接收数据,并且接受数据receive()监听,会阻塞程序的运行,因此需要多线程操作,
  3. 使用while 保持可以持续接受数据和发送数据,并设置退出情况
  4. 规范代码:声明定义分离,finally执行资源释放,

3.代码

Student.java

package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;

public class Student {
    public static void main(String[] args) {
        //学生发送消息到老师9001
        new Thread(new Send发送(8000,"127.0.0.1",9001)).start();
        //学生的接收为 8001
        new Thread(new Receive接收(8001)).start();
    }
}

Teacher.java

package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;

public class Teacher {
    public static void main(String[] args) {
        //老师发送到 8001 的学生
        new Thread(new Send发送(9000,"127.0.0.1",8001)).start();
        //老师开放9001的端口接受
        new Thread(new Receive接收(9001)).start();

    }
}

Send发送.java

package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
 * 多线程
 */
public class Send发送 implements Runnable {
    private String toAddress;
    private int toPort;
    private boolean flag;
    private int myPort;

    @Override
    public void run() {
        DatagramSocket datagramSocket = null;
        Scanner scanner = null;
        //构造定义分离
        try {
            //1. 构造开端口自己的开放的端口
            datagramSocket = new DatagramSocket(myPort);
            scanner = new Scanner(System.in);
            System.out.println("--------回车发送,bye 退出-------");
            while (flag) {
                String someText = scanner.nextLine();
                //2. 做一个发送包,指定目标地址,和端口 new DatagramPacket(字节数组,开始位置,结束位置,地址,端口)
                //字节数组,开始位置,结束位置,地址,端口
                DatagramPacket datagramPacket = new DatagramPacket(someText.getBytes(), 0, someText.getBytes().length, InetAddress.getByName(toAddress), toPort);
                //3.阻塞发送.必须多线程.
                datagramSocket.send(datagramPacket);
                if (someText.toLowerCase() == "bye") {
                    flag = false;
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 关闭 dataSocket.close()
            if (datagramSocket != null) {
                datagramSocket.close();
            }
            //关闭scanner
            scanner.close();
        }
    }

    public Send发送(int myPort, String toAddress, int toPort) {
        this.toAddress = toAddress;
        this.toPort = toPort;
        this.myPort = myPort;
        this.flag = true;
    }
}

Receive接收.java

package Java学习.网络编程.TCP_UDP.UDP通信代码实现.UDP聊天案例;

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

/**
 * 接受,多线程打开接受,
 * 构造:myPort
 * 一、步骤
 * 1.
 */
public class Receive接收 implements Runnable {
    private int myPort;

    @Override
    public void run() {
        //申明和定义分离
        DatagramSocket datagramSocket = null;
        byte[] bytes = null;
        DatagramPacket datagramPacket = null;
        try {
            //1.开Socket
            datagramSocket = new DatagramSocket(myPort);
            while (true) {
                //2.新建数据包
                bytes = new byte[1024 * 100];
                datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
                //3.阻塞接受
                datagramSocket.receive(datagramPacket);
                //输出发信息来源和内容》
                System.out.println("----" + datagramPacket.getAddress() + ":" + datagramPacket.getPort());
                System.out.println((new String(datagramPacket.getData(), 0, datagramPacket.getLength())));

            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭
            if (datagramSocket != null) {
                datagramSocket.close();
            }
        }
    }

    public Receive接收(int myPort) {
        this.myPort = myPort;
    }
}

因为UDP不需要建立连接,所以先执行Student或Teacher都i可以(你还可以试试群发)
在这里插入图片描述
在这里插入图片描述
因为不需要建立连接,所以断掉对方也不会马上报错.

问题:为何bye关闭不了??

原创文章 132 获赞 11 访问量 4703

猜你喜欢

转载自blog.csdn.net/jarvan5/article/details/106041125
今日推荐