初识UDP协议传输和接收数据
简单的自我介绍
作为一个还在潜修学习Java的学生,这是我第一次学习Java,也是自己第一次写博文。谈不上分享技术,只是将自己目前学到的知识小结,希望和一些也和我一样正在学Java的同学分享交流,也敬请各位斧正!
一,UDP协议发送数据:
基础步骤:
1, 创建发送端Socket对象
2,创建数据,并把数据打包
3,调用Socket对象的发送方法send()发送数据包
4,释放资源
package time_2_25;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据
byte[] bys = "Hello udp!".getBytes();
//IP地址对象(此处模拟自己给自己发送消息。如果需要发送给别,更改ip为接收方的ip即可)
InetAddress address = InetAddress.getByName("192.168.128.12");//ip可更改
//端口(自定义,建议用10000以上)
int port = 19225;
//构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号
DatagramPacket dp = new DatagramPacket(bys, bys.length, address, port);
//调用socket对象的发送方法发送数据包
ds.send(dp);
//释放资源
ds.close();
}
}
二,UDP协议接收数据
基础步骤:
1, 创建接收端Socket对象
2,创建一个数据包(接收对象)
3,调用socket对象的接收方法receive()接收数据
4,解析数据,并在控制台显示
5,释放资源
package time_2_25;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveDemo {
public static void main(String[] args) throws IOException{
//创建接收端Socket对象
//DatagramSocket(int port),创建数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket ds = new DatagramSocket(19225);
//创建一个数据包用于接收
//DatagramPacket(byte[] buf,int length)
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
//调用DatagramSocket对象的receive()方法接收数据
ds.receive(dp);//阻塞式
//获取ip地址
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
//解析数据包,并显示在控制台
//获取数据缓冲区
byte[] bys2 = dp.getData();
//获取数据实际长度
int len = dp.getLength();
//转为字符串
String s = new String(bys2,0,len);
System.out.println(ip+"发来消息:"+s);
//释放资源
ds.close();
}
}
三,几个注意事项和说明:
1,由于模拟的是自己给自己发送消息,因此在编译器上运行时,需要先运 行ReceiveDemo再运行SendDemo才能看到效果。因为DatagramSocket 中的receive方法在接收到数据报之前一直处于阻塞,所以此时在运行SendDemo发送数据,就可以看到效果。
2,为什么自己定义的端口号建议10000以上?
端口的使用有一定规则:
TCP与UDP段结构中端口地址都是16比特,可以有在0—65535范围内的端口号。对于这65536个端口号有以下的使用规定:
(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1—1023 · 之间的端口号,是由IANA来管理的;
(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;
(3)大多数TCP/IP实现给临时端口号分配1024—5000之间的端口号。大于5000的端口号是为其他服务器预留的。
因此自定义使用10000以上65535以下的端口号一般不会碰到端口号被占用的情况。