注意:该类对外不提供构造方法,使用静态方法getByXxx可以获得相应对象;
附加:对比【单例设计模式】
全称:数据报套接字
接收数据的一端实例对象时需要传入port,指定监听该端口;
发送数据的一端实例对象默认无参即可;
全称:数据报包
// 封装数据包
byte[] bys = line.getBytes();
int length = bys.length;
InetAddress ip = InetAddress.getByName("192.168.0.105");
int port = 10001;
DatagramPacket dp = new DatagramPacket(bys, length, ip, port);
//解析方法
dp.getAddress().getHostAddress();
dp.getData();
dp.getLength();
Server.java
package kyleeo.util_02_udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* UDP
* Server端用于接收与显示数据
* a) 创建Socket对象 DatagramSocket,绑定监听的端口
* b) 产生一个对象用于接收数据 DatagramPacket
* c) 调用Socket的接收方法 receive
* d) 数据解析与显示(获取发送方的IP、收到的数据、数据实际长度)
* e) 释放资源 close
*/
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建Socket对象
DatagramSocket socket = new DatagramSocket(10001);
for (;;) {
// 创建数据包,用于接收
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
// 调用Socket的接收方法
socket.receive(dp);
// 解析数据
String ipAddr = dp.getAddress().getHostAddress();
byte[] bys2 = dp.getData();
int length2 = dp.getLength();
String recvData = new String(bys2, 0, length2);
System.out.println(ipAddr + ":" + recvData);
}
// 释放资源
// socket.close();
}
}
Client.java
package kyleeo.util_02_udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP
* Client用于发送数据
* a) 创建Socket客户端 DatagramSocket
* b) 封装数据对象 DatagramPacket
* c) 调用Socket的发送方法 send
* d) 释放资源 close
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建Socket
DatagramSocket socket = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "GBK"));
String line = null;
while ((line = br.readLine())!= null) {
if(line.trim().equals("quit")) {
break;
}
// 封装数据包
byte[] bys = line.getBytes();
int length = bys.length;
InetAddress ip = InetAddress.getByName("192.168.0.105");
int port = 10001;
DatagramPacket dp = new DatagramPacket(bys, length, ip, port);
// 发送数据
socket.send(dp);
}
// 释放资源
socket.close();
}
}
ChatRoom.java
package kyleeo.util_02_udp;
import java.io.IOException;
import java.net.DatagramSocket;
public class ChatRoom {
public static void main(String[] args) throws IOException {
//创建接收与发送套接字
DatagramSocket dsServer = new DatagramSocket(10001);
DatagramSocket dsClient = new DatagramSocket();
//创建接收与发送线程
Thread recvTh = new ReceiveThread(dsServer);
Thread sendTh = new SendThread(dsClient);
recvTh.start();
sendTh.start();
}
}
ReceiveThread.java
package kyleeo.util_02_udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveThread extends Thread implements Runnable {
private DatagramSocket ds= null;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
for (;;) {
// 创建数据包,用于接收
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
// 调用Socket的接收方法
ds.receive(dp);
// 解析数据
String ipAddr = dp.getAddress().getHostAddress();
byte[] bys2 = dp.getData();
int length2 = dp.getLength();
String recvData = new String(bys2, 0, length2);
System.out.println(ipAddr + ":" + recvData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
SendThread.java
package kyleeo.util_02_udp;
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 SendThread extends Thread implements Runnable {
private DatagramSocket ds = null;
public SendThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "GBK"));
String line = null;
while ((line = br.readLine()) != null) {
if (line.trim().equals("quit")) {
break;
}
// 封装数据包
byte[] bys = line.getBytes();
int length = bys.length;
InetAddress ip = InetAddress.getByName("192.168.0.105");
int port = 10001;
DatagramPacket dp = new DatagramPacket(bys, length, ip, port);
// 发送数据
ds.send(dp);
}
// 释放资源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}