java使用DatagramSocket和DatagramPacket进行通信

本文深入讲解了使用UDP协议进行通信的原理与实践,包括DatagramSocket和DatagramPacket的使用方法,以及如何构建简单的服务器与客户端通信流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、DatagramSocket

DatagramSocket是使用UDP协议的Socket,它的作用是接收和发送数据包,但是它本身并不能产生IO流

 1、创建DatagramSocket对象

DatagramSocket()
//创建一个数据包套接字,绑定到本机上任意一个可用的端口

DatagramSocket(DatagramSocketImpl)
//创建一个绑定的数据报套接字, 与指定的datagramsocketimpl相关(一般不使用)
DatagramSocket(SocketAddress)
//通过制定的套接字地址来创建一个数据包套接字
DatagramSocket(int)
//指定本地的一个端口,以此来创建数据包套接字
DatagramSocket(int, InetAddress)
//创建一个DatagramSocket对象,并绑定到指定的地址和端口上

    2、接收和发送数据

    发送数据

public void send(DatagramPacket p) throws IOException  {.....}

  接收数据 

 public synchronized void receive(DatagramPacket p) throws IOException {....}

3、相关方法

   int getLocalPort()  返回绑定到本机套接字的端口

  InetAddress getInetAddress 返回套接字的连接地址

  void close()   关闭该数据报套接字

二、DatagramPacket

 DatagramPacket相当于一个被邮寄的包裹,上面写着收货人的地址,包裹里是所要传递的数据

1、创建DatagramPacket对象

 public DatagramPacket(byte[] buf,int length):以一个空数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。相当于一个缓冲池的作用

 public DatagramPacket(byte buf[], int offset, int length) {} :一一个空的数组来创建DatagramPacket对象,其中 int offset 代表偏移量,int length代表长度(也可以说是池子的容量)

  public DatagramPacket(byte buf[], int offset, int length,  InetAddress address, int port) { 。。。}:创建一个用于发送的DatagramPacket对象,指定发送buf数组中从offset开始,总共length个字节。

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口--这就决定了该数据报的目的地。

三、利用DatagramPacket和Datagramsocket简单实现服务器和客户端的通信

 1、创建客户端

     1) 创建客户端 DatagramSocket 类+指定端口 

     2)准备数据 字节数组

     3) 打包 DatagramPacket +服务器地址 以及端口

     4) 发送

    5) 释放资源

2、服务器端

  1)创建服务器 DatagramSocket 类+指定端口

  2)准备接受的容器 字节数组  封装 DatagramPacket

  3)  包接收资源

  4) 分析

  5) 释放资源

简单来说就是服务器先挖一个DatagramPacket的邮箱,时刻准备着接受邮件,客户端这边准备好所要邮寄的东西,写好所要邮寄的地址(DatagramPacket+服务器地址+端口)不然邮递员不知道把邮件往那发送。

代码实现:

服务器端:

package Internet;

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

public class UDP_chat {
public static void main(String[] args) throws IOException {
	//1、 构件服务端 +端口
	
	DatagramSocket server=new DatagramSocket(8888);
	//2、封装成包 DatagramPacket(byte[] buf,int lenth)  相当于构建接受池
	byte[] container=new byte[1024];
	DatagramPacket datagramPacket=new DatagramPacket(container, container.length);
	//接收客户端发来的数据
	server.receive(datagramPacket);
	//获取接收到的数据
	byte [] data=datagramPacket.getData();
	//获取接收到的数据的长度
     int len=datagramPacket.getLength();
    //输出相关的信息
     System.out.println(new String(data,0,len));
     //关闭接收流
     server.close();
}	
}

客户端:

package Internet;

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

public class Udp_chat_client {
	public static void main(String[] args) throws IOException {
		DatagramSocket datagramSocket=new DatagramSocket(9999);
		String meString="扬弟弟";
		byte[] bs=meString.getBytes();
		DatagramPacket datagramPacket=new DatagramPacket(bs, bs.length,new InetSocketAddress("localhost",8888));
		datagramSocket.send(datagramPacket);
		datagramSocket.close();

		
		
	}

}

实现结果:

扬弟弟

 

 

 

 

  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值