目录
一、 首先需要明确什么是Socket?
在java.net包中有一个socket包 java.net.socket包。
实际上Socket就可以理解为船舶运输的端点、起始点码头,IO数据就是船舶上的货物。
二、UDP
UDP协议是一种公共的协议,我们无法直接操作,Java为我们提供了一些对象封装了UDP,所以可以间接操作UDP。
在API中我们找到了 java.net.DatagramSocket
2.1DatagramSocket
2.1.1构造方法
Modifier | Constructor and Description |
---|---|
|
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。 |
protected |
DatagramSocket(DatagramSocketImpl impl) 使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。 |
|
DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。 |
|
DatagramSocket(int port, InetAddress laddr) 创建一个数据报套接字,绑定到指定的本地地址。 |
|
DatagramSocket(SocketAddress bindaddr) 创建一个数据报套接字,绑定到指定的本地套接字地址。 |
2.1.2 常用方法
void |
bind(SocketAddress addr) 将此DatagramSocket绑定到特定的地址和端口。 |
void |
close() 关闭此数据报套接字。 |
void |
connect(InetAddress address, int port) 将套接字连接到此套接字的远程地址。 |
boolean |
isClosed() 返回套接字是否关闭。 |
InetAddress |
getInetAddress() 返回此套接字连接到的地址。 |
InetAddress |
getLocalAddress() 获取套接字所绑定的本地地址。 |
void |
send(DatagramPacket p) 从此套接字发送数据报包。 |
在看到send 发送方法看到了DatagramPacket
3.1DatagramPacket
查看API介绍发现是用于装数据的。
3.1.1构造方法
Constructor and Description |
---|
DatagramPacket(byte[] buf, int length) 构造一个 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造用于发送长度的分组的数据报包 |
DatagramPacket(byte[] buf, int offset, int length) 构造一个 |
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造用于发送长度的分组数据报包 |
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造用于发送长度的分组数据报包 |
DatagramPacket(byte[] buf, int length, SocketAddress address) 构造用于发送长度的分组的数据报包 |
在众多的构造方法中有发送功能的,有接收功能的,区别发送功能和接收功能的就是看参数中有无address、port。有就是指明将要发送的目的地。
3.1.2常用方法
Modifier and Type | Method and Description |
---|---|
InetAddress |
getAddress() 返回该数据报发送或接收数据报的计算机的IP地址。 |
byte[] |
getData() 返回数据缓冲区。 |
int |
getLength() 返回要发送的数据的长度或接收到的数据的长度。 |
int |
getOffset() 返回要发送的数据的偏移量或接收到的数据的偏移量。 |
int |
getPort() 返回发送数据报的远程主机上的端口号,或从中接收数据报的端口号。 |
SocketAddress |
getSocketAddress() 获取该数据包发送到或正在从其发送的远程主机的SocketAddress(通常为IP地址+端口号)。 |
void |
setAddress(InetAddress iaddr) 设置该数据报发送到的机器的IP地址。 |
void |
setData(byte[] buf) 设置此数据包的数据缓冲区。 |
void |
setData(byte[] buf, int offset, int length) 设置此数据包的数据缓冲区。 |
void |
setLength(int length) 设置此数据包的长度。 |
void |
setPort(int iport) 设置发送此数据报的远程主机上的端口号。 |
void |
setSocketAddress(SocketAddress address) 设置该数据报发送到的远程主机的SocketAddress(通常是IP地址+端口号)。 |
三、UPD传输实例
3.1 创建发送端:
public class UDPSendDemo {
public static void main(String[] args) throws IOException {
System.out.println("发送端启动...........");
/**
* 创建UDP传输的发送端
* 思路:
* 1、建立UDP的Socket服务
* 2、将要发送的的数据封装到数据包中
* 3、通过UDP的Socket服务将数据包发送出去
* 4、关闭Socket服务
*/
//1 updsocket服务 使用 datagramSocket
DatagramSocket ds =new DatagramSocket(9999);
//2,将要发送的数据封装到数据包中。
String str="hello 小年快乐";
//使用DatagramPacket将数据封装到的该对象包中。
byte[] bytes=str.getBytes();
DatagramPacket dp=new DatagramPacket(bytes,bytes.length, InetAddress.getByName("127.0.0.1"),8888);
//3,通过udp的socket服务将数据包发送出去。使用send方法。
ds.send(dp);
//4、关闭Socket服务
ds.close();
}
}
3.2 创建接收端
public class UDPReceDemo {
public static void main(String[] args) throws IOException {
System.out.println("接收端启动............");
/**
* 建立UDP接收端的服务
*1、建立udp的socket服务,必须明确一个和发送端一直的端口
*2、创建数据包,方便存储接收到的数据。方便使用数据包对象的方法解析这些数据。
*3、使用socket服务的receive方法将接收到的数据存储到数据包中。
*4、通过数据包的方法解析数据。
*5、关闭socket资源。
*/
//1、建立udp的socket服务,必须明确一个和发送端一致的端口
DatagramSocket ds=new DatagramSocket(8888);
//2、创建数据包,方便存储接收到的数据。方便使用数据包对象的方法解析这些数据。
byte[] buf =new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,0,buf.length);
//3、使用socket服务的receive方法将接收到的数据存储到数据包中。
//此方法为阻塞式方法
ds.receive(dp);
//4、通过数据包对象的方法。 解析其中的数据:地址、端口、内容
String hostAddress = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(hostAddress+":"+port+":"+text);
ds.close();
}
}
先启动接收端。
再启动发送端:
重看接收端: