Java编程--网络编程(UDP)
一. UDP协议发送数据:
(1)创建发送端socket对象
(2)创建数据并把数据打包
(3)调用socket对象的发送方法发送数据包
(4)释放资源
与UDP发送端有关的方法:
java.net java.net.DatagramSocket 此类表示用来发送和接收数据报包的套接字。
扫描二维码关注公众号,回复:
1065251 查看本文章
|
java.net 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(); } }