目录
一:UDP传输步骤
二:UDP发送端和接收端
1:UDP传输-发送端思路
2:UDP传输-接收端思路
3:例子
4:注意
三:练习
DatagramSocket与DatagramPacket
建立发送端,接收端。 建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
1:建立udp的socket服务
DatagramSocket /建立UDP发送端的Socket对象,构造数据报套接字并将其绑定到本地主机上的任何可用端口
2:将要发送的数据封装成数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port) //创建数据,构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
3:通过udp的socket服务,将数据包发送出
send()方法
4:关闭资源
1:建立udp的socket服务.
DatagramSocket(int port) //创建接收端的Socket对象,构造数据报套接字并将其绑定到本地主机上的指定端口。
2:通过receive方法接收数据
DatagramPacket(byte[] buf, int length) //构造一个 DatagramPacket用于接收长度的数据包 length 。
3:将收到的数据存储到数据包对象中
public void receive(DatagramPacket p)调用Socket的接收方法接收数据
4:通过数据包对象的功能来完成对接收到数据进行解析.
5:可以对资源进行关闭
发送端
package day34;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendTest {
public static void main(String[] args) throws Exception{
//创建发送方对象
DatagramSocket datagramSocket = new DatagramSocket();
//将发送信息打包
byte[] bytes = "hello".getBytes();
DatagramPacket localhost = new DatagramPacket(bytes,
bytes.length, InetAddress.getByName("127.0.0.1"), 8888);
//发送消息
datagramSocket.send(localhost);
//关闭资源
datagramSocket.close();
}
}
接收端
package day34;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveTest {
public static void main(String[] args) throws Exception{
//创建接收方对象
DatagramSocket datagramSocket = new DatagramSocket(8888);
//接收对象
byte[] b =new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
//接收数据
datagramSocket.receive(datagramPacket);
//将接收数据进行解析
String s = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(datagramPacket.getAddress()+":"+s);
//关闭资源
datagramSocket.close();
}
}
记得关闭资源,关闭资源后就不能发送消息
要先运行接收端信息再运行发送端,否则会收不到消息
从键盘录入数据进行发送,如果输入的是886那么客户端就结束输入数据。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
从键盘录入数据进行发送
如果输入的是886那么客户端就结束输入数据。
*/
public class SendDemo3 {
public static void main(String[] args) throws Exception{
//创建发送端的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;
}
//如果输入的不是886,就封装到数据包中,发送出去
DatagramPacket dp = new DatagramPacket(line.getBytes(), line.getBytes().length,
InetAddress.getByName("localhost"), 12345);
ds.send(dp);
}
ds.close();
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
UDP接收端一致接收数据
*/
public class ReceviceDemo3 {
public static void main(String[] args) throws Exception{
//创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(12345);
while (true){
//创建一个数据接收容器
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
//解析数据
InetAddress ip = dp.getAddress();//获取发送人的IP
byte[] data = dp.getData();
String s = new String(data, 0, dp.getLength());
System.out.println(ip + ":" + s);
}
}
}