Java案例——UDP通信程序
需求:按照下面的要求实现程序:
- UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束。
- UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收。
思路:
发送数据的步骤:
- 创建发送端的Socket对象(DatagramSocket):DatagramSocket()
- 创建数据,并把数据打包:DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 调用DatagramSocket对象的方法发送数据:void send(DatagramPacket p)
- 关闭发送端:void close()
接收数据的步骤:
- 创建接收端额Socket对象(DatagramSocket):DatagramSocket(int port)
- 创建一个数据包,用于接收数据:DatagramSocket(byte[] buf, int length)
- 调用DatagramSocket对象的方法接收数据:void receive(DatagramPacket p)
- 解析数据包,并把数据在控制台显示:bytep[] getData()和int getLength()
- 关闭接收端:void close()
代码实现(先运行接收程序,再运行发送程序):
package InetPackage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class TestSend {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket);
DatagramSocket ds = new DatagramSocket();
//自己封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=br.readLine()) != null){
//输入的数据是886,发送数据结束
if(line.equals("886")){
sendData(ds,line);
break;
}
sendData(ds, line);
}
//关闭发送端。
ds.close(); //void close():关闭此数据包套接字
}
public static void sendData(DatagramSocket ds, String line) throws IOException {
//创建数据,并把数据打包;
byte[] bys = line.getBytes();
//DatagramPacket(byte[] buf, int length, InetAddress address, int port):
//构造一个数据报,发送长度为length 的数据包到指定主机上的指定端口号。
int length = bys.length; //数据长度
InetAddress address = InetAddress.getByName("192.168.0.103");
int port = 20000; //端口号
DatagramPacket dp = new DatagramPacket(bys, length, address, port);
//调用DatagramSocket对象的方法发送数据;
//void send(DatagramSocket p):从此套接字中发送数据报包
ds.send(dp);
}
}
package InetPackage;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class TestReceive {
public static void main(String[] args) throws IOException {
//创建接收端Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket(20000);
boolean b;
while (true) {
b = recvData(ds);
if (b == false) {
ds.close();
break;
}
}
}
public static boolean recvData(DatagramSocket ds) throws IOException {
//创建一个数据包,用于接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//调用DatagramSocket对象的方法接收数据
ds.receive(dp);
//解析数据包,并把数据在控制台显示
//byte[] getData():返回数据缓冲区
byte[] data = dp.getData();
int len = dp.getLength(); //实际发送的数据长度
String dataString = new String(data, 0, len);
if (dataString.equals("886")) {
System.out.println("发送已结束!");
return false;
}else {
System.out.println("数据是:" + dataString);
return true;
}
}
}
TestSend控制台结果:
你好
HelloWorld
Java
886
TestReceive控制台结果:
数据是:你好
数据是:HelloWorld
数据是:Java
发送已结束!