2 UDP通信程序
2.1 UDP通信原理
-
UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象, 但是这两个Socket只是发送,接收数据的对象因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
-
Java提供了DatagramSocket类作为基于UDP协议的Socket
2.2 UDP发送数据
- 发送数据的步骤
- 1、创建发送端的Socket对象(DatagramSocket):
DatagramSocket()
- 2、创建数据, 并把数据打包:
DatogramPacket (byte[] buf, int Length, InetAddress address, int port)
- 3、调用DatagramSocket对象的方法发送数据:
void send(DatagramPacket p)
- 4、关闭发送端:
void close()
- 1、创建发送端的Socket对象(DatagramSocket):
- 范例
package test;
import java.io.IOException;
import java.net.*;
public class Demo {
public static void main(String[] args) throws IOException {
//1、创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//2、创建数据, 并把数据打包
//DatogramPacket (byte[] buf, int Length, InetAddress address, int port)
// 构造一个数据包,发送长度为length的数据 包到指定主机上的指定端口号。
byte[] bys = "hello,java".getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);
//3、调用DatagramSocket对象的方法发送数据
//void send(DatagramPacket p)
ds.send(dp);
//4、关闭发送端
ds.close();
}
}
2.3 UDP接收数据
- 接收数据的步骤
- 1、创建接收端的Socket对象(DatagramSocket):
DatagramSocket(int port)
- 2、创建一个数据包, 用于接收数据:
DatagramPacket(byte[] buf, int length)
- 3、调用DatagramSocket对象的方法接收数据:
void receive(DatagramPacketp)
- 4、解析数据包, 并把数据在控制台显示:
byte[] getData()
、int getLength()
- 5、关闭接收端:
void close()
- 1、创建接收端的Socket对象(DatagramSocket):
package test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//1、创建接收端的Socket对象(DatagramSocket):DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086);
//2、创建一个数据包, 用于接收数据
//DatagramPacket(byte[] buf, int length):构造一个DatagramPacket用来接收长度为length的数据包
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//3、调用DatagramSocket对象的方法接收数据:void receive(DatagramPacketp)
ds.receive(dp);
//4、解析数据包, 并把数据在控制台显示:
// byte[] getData():返回数据缓冲区 int getLength()
byte[] datas = dp.getData();
//int getlength():返回要发送的数据长度或接收的数据长度
int len = dp.getlength();
String dataString = new String(datas,0,len);
System.out.println("数据是:"+dataString);
//5、关闭接收端:void close()
ds.close();
}
}
2.4 范例
- 发送端
package test;
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 {
//1、创建发送端的Socket对象(DatagramSocket):DatagramSocket()
DatagramSocket ds = new DatagramSocket();
//键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
} else {
//创建数据并把数据打包
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 1001);
//3、调用DatagramSocket对象的方法发送数据:void send(DatagramPacket p)
ds.send(dp);
}
}
ds.close();
}
}
- 接收端
package test;
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):DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(1001);
while(true) {
//创建一个数据包接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//调用DatagramSocket对象的方法接收数据:void receive(DatagramPacketp)
ds.receive(dp);
//解析数据包, 并把数据在控制台显示:byte[] getData()、int getLength()
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}
//关闭
// ds.close();
}
}