Java网络:UDP协议实现客户端和服务器通信

UDP协议通信

UDP中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

基于UDP通信的基本模式是:将数据打包成数据包,将数据包发往目的地,接收数据包并查看数据包中的内容。

每个数据包包含:自己的IP和程序端口、目的的IP和程序端口、数据(限制在64KB内)等。

由于UDP通信是一种无连接、不可靠的通信,一般适用于对通信效率要求较高、不要求传输完整性的通信,如音频和多媒体应用、视频直播、语音通话等。


Java中的实现类

Java中提供了一个java.net.DatagramSocket类来实现UDP通信的客户端和服务端,用java.net.DatagramPacket类实现UDP数据包。

UDP套接字

1. 常用构造方法

构造方法说明
DatagramSocket()在本地主机创建UDP套接字对象,系统会随机分配一个端口号,常用作构造客户端
DatagramSocket(int port)在本地主机创建UDP套接字对象,并指定一个端口号,常用作构造服务端
DatagramSocket(int port, InetAddress laddr)在指定主机地址创建UDP套接字,并指定一个端口号

2. 常用成员方法

成员方法说明
void send(DatagramPacket p)发送数据包
void receive(DatagramPacket p)接收数据包
void close()关闭此UDP套接字

UDP数据包

1. 常用构造方法

构造方法说明
DatagramPacket(byte[] buf, int length)创建一个用来接收的数据包对象
DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建一个用来发送的数据包对象,指定数据、长度、目的ip地址和端口号

2. 常用成员方法

成员方法说明
void getLength()返回要发送或接收到的数据的长度
SocketAddress getSocketAddress()返回要发送数据的目的套接字或接收到数据的来源套接字

简单应用代码

// Server.java

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

public class Server {
    public static void main(String[] args) {
        System.out.println("服务端已打开");
        try(DatagramSocket socket = new DatagramSocket(8888)) {
                //DatagramSocket实现了Closeable接口,在try()内可以自动关闭
            byte[] buffer = new byte[1024*64];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            while(true) { //服务器一般不会主动停止运行,不设置结束条件
                socket.receive(packet);
                String s = new String(buffer, 0, packet.getLength());//转化为字符串
                System.out.println(s);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
// Client.java

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

public class Client {
    public static void main(String[] args) {
        System.out.println("客户端已打开");
        try(DatagramSocket socket = new DatagramSocket()) {
            Scanner scanner = new Scanner(System.in);
            while(true){
                String msg = scanner.nextLine();
                if("exit".equals(msg)){
                    break;
                }
                byte[] bytes = msg.getBytes();
                DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
                        InetAddress.getLocalHost(), 8888); 
                        //使用InetAddress.getLocalHost()在本地主机进行模拟
                socket.send(packet);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        System.out.println("客户端发送完毕");
    }
}
  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

STRANGEX-03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值