说明
TCP是一个面向连接的协议,TCP一定是点对点的,一点是两个主机来建立连接的,基于TCP实现的肯定是单播(但单播还可以使用UDP协议实现)。只有UDP才会使用广播和组播。
Java中的单播、组播和广播可以使用TCP或UDP协议来实现,具体取决于应用程序的需求和设计。
- 对于单播,在Java中使用TCP协议来实现对点之间的通信,使用UDP协议来实现实时性要求高、数据量小、可靠性要求不高的对点之间的通信。
- 对于组播,在Java中常使用UDP协议来实现组播。组播是将数据包从一个源节点传送到一组目标节点,可以更有效的利用网络带宽。
- 对于广播,在Java中使用UDP协议来实现广播。广播是将数据包从一个源节点传送到所有的目标节点,可以在局域网中快速的传输信息。
使用Java实现单播
使用TCP实现单播
服务端
import java.net.*;
import java.io.*;
/**
* Java实现单播
* 服务端
*/
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
System.out.println("连接客户端成功");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String message = in.readLine();
System.out.println("收到客户端消息: " + message);
out.println("你好,客户端。");
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
import java.net.*;
import java.io.*;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8888);
System.out.println("连接服务端成功");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("你好,服务端。");
String message = in.readLine();
System.out.println("收到服务端消息: " + message);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先启动服务端,再启动客户端。
结果打印:
服务端
客户端
使用UDP实现单播
接收端
import java.net.*;
public class UnicastReceiver {
public static void main(String[] args) {
try {
// 创建UDP套接字并指定端口号
DatagramSocket socket = new DatagramSocket(9999);
// 创建UDP数据包缓冲区
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 接收数据包
socket.receive(packet);
// 输出数据包内容
String message = new String(packet.getData());
System.out.println("收到消息: " + message);
// 关闭UDP套接字
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
发送端
import java.net.*;
public class UnicastSender {
public static void main(String[] args) {
try {
// 创建UDP套接字
DatagramSocket socket = new DatagramSocket();
// 准备要发送的数据
String message = "你好,接收端。";
byte[] data = message.getBytes();
// 接收方IP地址
InetAddress address = InetAddress.getByName("127.0.0.1");
// 接收方端口号
int port = 9999;
// 创建UDP数据包
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 发送数据
socket.send(packet);
// 关闭UDP套接字
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
先启动接收端,再启动发送端。
执行结果如下:
使用Java实现UDP组播
TCP是点对点的,所以实现组播得使用UDP协议
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MulticastReceiver {
public static void main(String[] args) {
try {
// 创建一个组播地址
InetAddress group = InetAddress.getByName("224.0.0.1");
// 创建一个组播套接字并加入组
MulticastSocket multicastSocket = new MulticastSocket(8888);
multicastSocket.joinGroup(group);
// 接收数据
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
multicastSocket.receive(packet);
String message = new String(buffer, 0, packet.getLength());
System.out.println("收到消息: " + message);
// 关闭套接字
multicastSocket.leaveGroup(group);
multicastSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MulticastSender {
public static void main(String[] args) {
try {
// 创建一个组播地址
InetAddress group = InetAddress.getByName("224.0.0.1");
// 创建一个组播套接字
MulticastSocket multicastSocket = new MulticastSocket();
// 发送数据
byte[] data = "Hello, 组播!".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, group, 8888);
multicastSocket.send(packet);
// 关闭套接字
multicastSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先启动接收端,再启动发送端。
执行结果如下:
使用Java实现UDP广播
发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 广播
* 服务端
*/
public class UdpBroadcastServer {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String message = "这是一条广播!";
byte[] data = message.getBytes();
/*我们使用的目标地址是 255.255.255.255,这个地址表示广播给本地网络中所有的设备。*/
InetAddress address = InetAddress.getByName("255.255.255.255");
DatagramPacket packet = new DatagramPacket(data, data.length, address, 8888);
socket.send(packet);
System.out.println("发送消息: " + message);
socket.close();
}
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 客户端
*/
public class UdpBroadcastClient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8888);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到消息: " + message);
socket.close();
}
}
先启动接收端,再启动发送端
打印结果如下: