文章目录
- UDP协议
- UDP协议链式编程
- UDP协议键盘录入
- UDP协议键盘录入多线程实现
UDP协议
java.net.DatagramSocket:此类表示用来发送和接收数据报包的套接字。 (里面有数据包那就是UDP协议)
UDP:
把数据打包
数据有限制
不建立连接
速度快
不可靠
UDP协议发送和接收数据图解
UDP编程演示
UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源
public class DataGramSocketSendDemo {
public static void main(String[] args) throws IOException {
//1.创建udp发送端Socket对象
//DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket ds = new DatagramSocket();
//2.创建数据并打包
//不知道怎么创建数据并包,就先放着。先看后面
//DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
//将发送的数据转换为字节数组
byte[] bys = "格雷福斯我要打野".getBytes();
//获取字节数组的长度
int len = bys.length;
//指定发个那个ip,指定发送到哪个ip。
InetAddress address = InetAddress.getByName("192.168.150.1");
//定义端口
int port = 10000;
DatagramPacket dg = new DatagramPacket(bys, len, address, port);
//3.使用Socket对象调用方法发送数据
//但是我也不知道,怎么发送?那就去看该对象的方法。
// void send(DatagramPacket p):从此套接字发送数据报包。
//通过该方法的参数,知道了需要DatagramPacket的对象,参数里面介绍还需要一个四个参数的构造方法。
ds.send(dg);
//4.释放资源
ds.close();
}
}
UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源
public class DatagramSocketReceiveDemo {
public static void main(String[] args) throws IOException {
//1.创建接udp收端Socket对象
//1.DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds = new DatagramSocket(10000);
//2.创建一个容器用于接收数据包
//创建一个字节数组,因为我知道数据有多大
//DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为 length 的数据包。
byte[] bys = new byte[1024];
int len = bys.length;
DatagramPacket dg = new DatagramPacket(bys,len);
//3.调用Socket对象方法接收数据
// void receive(DatagramPacket p):从此套接字接收数据报包。
ds.receive(dg);//阻塞式方法 数据来了才读。
//4.解析数据包,并显示在控制台
// InetAddress getAddress():返回某台机器的 IP 地址
InetAddress address = dg.getAddress();
String ip = address.getHostAddress();
//获取数据
//void setData(byte[] buf):为此包设置数据缓冲区。
byte[] datas = dg.getData();
//int getLength():返回将要发送或接收到的数据实际的长度。
int lens = dg.getLength();
String s = new String(datas,0,lens);
System.out.println(ip + "传递的数据是:" + s);
//5.释放资源
ds.close();
}
}
结果:
192.168.150.1传递的数据是:格雷福斯我要打野
UDP协议链式编程
UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源
public class DatagramSocketSendDemo {
public static void main(String[] args) throws IOException {
//1.创建udp发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//2.创建数据包
byte[] bytes = "格雷福斯我要打野".getBytes();
DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.150.1"),10000);
//3.使用Socket对象,发送数据。
ds.send(dp);
//4.释放资源
ds.close();
}
}
UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源
public class DatagramSocketReciveDemo {
public static void main(String[] args) throws IOException {
//1.创建udp接收端Socket对象
DatagramSocket sd = new DatagramSocket(10000);
//2.创建数据包
byte[] bytes= new byte[1024];
DatagramPacket dp =new DatagramPacket(bytes,bytes.length);
//3.接收数据
sd.receive(dp);
//4.解析数据
System.out.println(new String(dp.getData(),0,dp.getLength()));
//5.关闭资源
sd.close();
}
}
UDP协议键盘录入
数据来自于键盘录入
键盘录入数据要自己控制录入结束。(输入886结束)
UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源
代码演示
public class DatagramSoketSendDemo {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//创建字符输出流对象(模拟键盘录入)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = null;
if ((line = br.readLine()) != null) {
//这里是有个问题的,如果这里的死循环,没有break。ds.close()就会报错,
// 如果没有终止,就不会走释放资源。
if (line.equals("886")) {
break;
}
byte[] bytes = line.getBytes();
//创建数据包,封装数据
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.150.1"), 10001);
//发送数据
ds.send(dp);
}
}
//释放资源
ds.close();
}
}
UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源
public class DatagramSocketReciveDemo {
public static void main(String[] args) throws IOException {
//1.创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(10001);
while (true) {
//2.创建数据包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//3.接收数据
ds.receive(dp);
//4.分析数据
System.out.println(new String(dp.getData(), 0, dp.getLength()));
}
//5.释放资源
//ds.close();
}
}
结果:接受端
我想用男枪打野?
但是我的盲僧玩的更好怎么办?
我也可以玩亚索!
UDP协议键盘录入多线程实现
代码演示
多线程测试
public class ChatRoom {
public static void main(String[] args) {
//创建线程对象
SendThread st= new SendThread();
ReciveThread rt= new ReciveThread();
//启动线程
st.start();
rt.start();
}
}
UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源
public class SendThread extends Thread {
@Override
public void run() {
DatagramSocket ds = null;
try {
//1.创建发送端Socket对昂
ds = new DatagramSocket();
//创建字节输入流对象(模拟键盘录入)
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
String line = null;
while (true){
if((line=br.readLine())!=null){
if("886".equals(line)){
break;
}
byte[] bytes = line.getBytes();
//2.创建数据包,并封装数据
DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.150.1"),10002);
//3.发送数据
ds.send(dp);
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭资源
ds.close();
}
}
}
UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源
public class ReciveThread extends Thread {
@Override
public void run() {
//1.创建接收端Socket对象
try {
DatagramSocket ds = new DatagramSocket(10002);
while (true) {
//2.创建数据包裹
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//3.接收数据
ds.receive(dp);
//4.分析数据
byte[] data = dp.getData();
//返回实际长度
int len = dp.getLength();
System.out.println(new String(data, 0, len));
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:
天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,揉食指然也。
天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,揉食指然也。
岳云鹏,郭德纲。
岳云鹏,郭德纲。
我想用格雷福斯打野
我想用格雷福斯打野