一. UDP协议发送数据:
(1)创建发送端socket对象
(2)创建数据并把数据打包
(3)调用socket对象的发送方法发送数据包
(4)释放资源
与UDP发送端有关的方法:
java.net java.lang.Object java.net.DatagramSocket 此类表示用来发送和接收数据报包的套接字。 |
java.net java.lang.Object java.net.DatagramPacket 此类表示数据报包。 |
public void send(DatagramPacket p): 从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 |
public DatagramPacket(byte[] buf,int length,InetAddress address,int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。 参数: buf - 包数据。 length - 包长度。 address - 目的地址。 port - 目的端口号。 |
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP协议发送数据:
* (1)创建发送端socket对象
* (2)创建数据并把数据打包
* (3)调用socket对象的发送方法发送数据包
* (4)释放资源
* */
public class SendDemo {
public static void main(String[] args) throws IOException {
//(1)创建发送端socket对象
// DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket ds = new DatagramSocket();
//(2)创建数据并把数据打包
// public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
// 1-创建数据
byte[] bys = "hello UDP,我来了".getBytes();
// 2-长度
int len = bys.length;
// 3-IP地址
InetAddress address = InetAddress.getByName("192.168.80.1");
// 4-端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys,len,address,port);
//(3)调用socket对象的发送方法发送数据包
ds.send(dp);
//(4)释放资源
ds.close();
}
}
二. UDP协议接收数据:
(1)创建发送端socket对象(需要指定端口)
(2)创建一个数据包(接收容器)
(3)调用socket对象的接收方法接收数据
(4)解析数据并显示在控制台
(5)释放资源
与UDP接收端相关的方法:
public DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。 |
DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为 length 的数据包。 |
public void receive(DatagramPacket p):从此套接字接收数据报包。 |
public byte[] getData():返回数据缓冲区。 |
public int getLength():返回将要发送或接收到的数据的长度。 |
public InetAddress getAddress():返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 |
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP协议接收数据:
(1)创建发送端socket对象
(2)创建一个数据包(接收容器)
(3)调用socket对象的接收方法接收数据
(4)解析数据并显示在控制台
(5)释放资源
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// (1)创建发送端socket对象
// public DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds = new DatagramSocket(10086);
// (2)创建一个数据包(接收容器)
// DatagramPacket(byte[] buf, int length):构造DatagramPacket,用来接收长度为
// length 的数据包。
byte[] bys = new byte[1024];
int len = bys.length;
DatagramPacket dp = new DatagramPacket(bys, len);
// (3)调用socket对象的接收方法接收数据
// public void receive(DatagramPacket p):从此套接字接收数据报包。
ds.receive(dp);
// (4)解析数据并显示在控制台
// 获取对方的IP
// public InetAddress getAddress():返回某台机器的 IP地址,此数据报将要发往该机器或者是从该机器接收到的。
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
// public byte[] getData():返回数据缓冲区。
// public int getLength():返回将要发送或接收到的数据的长度。
byte[] bys2 = dp.getData();
int len2 = dp.getLength();
String s = new String(bys2, 0, len2);
System.out.println(ip + ":" + s);
// (5)释放资源
ds.close();
}
}
代码优化:
【接收端】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端的socket对象
DatagramSocket ds = new DatagramSocket(12345);
// 创建一个包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 接收数据
ds.receive(dp);
// 解析数据
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("form " + ip + ":" + s);
// 释放资源
ds.close();
}
}
【发送端】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws IOException{
// 创建一个socket对象
DatagramSocket ds = new DatagramSocket();
// 创建数据并打包
byte[] bys = "hello world".getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("192.168.80.1"), 12345);
// 发送数据
ds.send(dp);
// 释放资源
ds.close();
}
}
【案例】数据来自于键盘录入,当用户输入“886”终止。
接收端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端的socket对象
DatagramSocket ds = new DatagramSocket(12345);
while (true) {
// 创建一个包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 接收数据
ds.receive(dp);
// 解析数据
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("form " + ip + ":" + s);
}
// 接收端应该一直开着接收数据,不需要关闭
// 释放资源
// ds.close();
}
}
发送端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建一个socket对象
DatagramSocket ds = new DatagramSocket();
// 创建数据并打包
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.80.1"), 12345);
// 发送数据
ds.send(dp);
}
// 释放资源
ds.close();
}
}