UDP通讯协议练习
作者:互联网
UDP通讯协议练习
UDP是属于一种不可靠的协议 ,在通信的两端 需要建一个Socket(网络套接字)对象。但是这两个Socket只是发送和接收数据的对象,因此对于基于UDP协议的通信而言,没有所谓的客户端和服务器的概念。
DataGramSocket 基于UDP协议的Socket
- 此类表示用于发送和接收数据报数据包的套接字。
- 数据报套接字是分组传送服务的发送或接收点。
构造方法:
-
DatagramSocket()
构造数据报套接字并将其绑定到本地主机上的任何可用端口。protected
DatagramSocket(DatagramSocketImpl impl)
使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。DatagramSocket(int port)
构造数据报套接字并将其绑定到本地主机上的指定端口。DatagramSocket(int port, InetAddress laddr)
创建一个数据报套接字,绑定到指定的本地地址。DatagramSocket(SocketAddress bindaddr)
创建一个数据报套接字,绑定到指定的本地套接字地址。 -
void
receive(DatagramPacket p)
从此套接字接收数据报包。void
send(DatagramPacket p)
从此套接字发送数据报包。
DatagramPacket:
-
该类表示数据报包。数据报包用于实现无连接分组传送服务。
-
DatagramPacket(byte[] buf, int length)
构造一个DatagramPacket
用于接收长度的数据包length
。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造用于发送长度的分组的数据报包length
指定主机上到指定的端口号。DatagramPacket(byte[] buf, int offset, int length)
构造一个DatagramPacket
用于接收长度的分组length
,指定偏移到缓冲器中。DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造用于发送长度的分组数据报包length
具有偏移ioffset
指定主机上到指定的端口号。DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
构造用于发送长度的分组数据报包length
具有偏移ioffset
指定主机上到指定的端口号。DatagramPacket(byte[] buf, int length, SocketAddress address)
构造用于发送长度的分组的数据报包length
指定主机上到指定的端口号。
发送数据
package cn.lanqiao.thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class Send {
public static void main(String[] args) throws IOException {
//创建发送端的网络套字节Socket对象
DatagramSocket ds = new DatagramSocket();
//创建字符缓冲流
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//String对象用于保存每次读取的字符串
String line;
while (true){
//调用字符缓冲流特有对象readline 读取一行数据
line = reader.readLine();
//将字符串转换为字节数组
byte[] bytes = line.getBytes(StandardCharsets.UTF_8);
//创建数据报包对象 并将字节数组打包
DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("127.0.0.1"),3201);
//调用网络网络套字节对象的send方法发送数据包
ds.send(dp);
//如果读取到的数据为bye 则结束循环
if("bye".equals(line))
break;
}
//关闭网络套字节对象
ds.close();
}
}
接收数据
package cn.lanqiao.thread;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Recive {
public static void main(String[] args) throws IOException {
//创建网络套字节对象,并绑定到指定端口
DatagramSocket ds = new DatagramSocket(3201);
while(true){
//定义字节数组用于保存收到的数据包
byte[] bytes = new byte[1024];
//定义数据包对象 用于接收长度为length 的数据包
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//调用网络字节套对象的接收数据包方法存到dp数据包中
ds.receive(dp);
//数据包对象的getData方法将收到的数据包中的数据读取出来
System.out.println("收到的数据为:" + new String(dp.getData(),0, dp.getLength()));
}
}
}
运行结果
标签:UDP,DatagramPacket,java,int,练习,length,通讯,import,接字 来源: https://blog.csdn.net/qq_43499656/article/details/119254947