UDP和TCP示例程序
查看自己的IP地址
以管理员身份运行cmd
输入
ipconfig
复制图中的IPv4地址
UDP通信程序
UdpReceiver.java
import java.net.*;public class UdpReceiver {public static void main(String[] args) {// 监听端口(需与发送端保持一致)int listenPort = 8888;// 接收数据的缓冲区大小(这里设置为1024字节)byte[] receiveBuffer = new byte[1024];try (DatagramSocket socket = new DatagramSocket(listenPort)) {System.out.println("接收端已启动,正在监听端口 " + listenPort + " ...");// 创建用于接收数据的空数据报包DatagramPacket packet = new DatagramPacket(receiveBuffer, receiveBuffer.length);// 阻塞等待接收数据(程序会在此处暂停,直到收到数据)socket.receive(packet);// 解析接收到的数据String receivedMessage = new String(packet.getData(), 0, packet.getLength() // 只取有效数据部分(避免缓冲区残留数据干扰));// 打印发送方信息和接收内容System.out.println("收到来自 " + packet.getAddress().getHostAddress() + ":" + packet.getPort() + " 的消息:" + receivedMessage);} catch (SocketException e) {System.err.println("Socket创建失败(可能端口被占用):" + e.getMessage());} catch (Exception e) {System.err.println("接收过程中发生异常:" + e.getMessage());}}
}
UdpSender.java
import java.net.*;public class UdpSender {public static void main(String[] args) {// 目标IP地址String targetIp = "172.18.92.212";// 目标端口(需与接收端保持一致)int targetPort = 8888;// 要发送的数据String message = "这是来自UDP发送端的测试消息!";try (DatagramSocket socket = new DatagramSocket()) {// 将字符串转换为字节数组byte[] sendData = message.getBytes();// 创建数据报包:指定目标地址、端口和要发送的数据DatagramPacket packet = new DatagramPacket(sendData, sendData.length, InetAddress.getByName(targetIp), targetPort);// 发送数据报socket.send(packet);System.out.println("发送成功!发送内容:" + message);} catch (SocketException e) {System.err.println("Socket创建失败:" + e.getMessage());} catch (UnknownHostException e) {System.err.println("目标IP地址解析失败:" + e.getMessage());} catch (Exception e) {System.err.println("发送过程中发生异常:" + e.getMessage());}}
}
运行
先启动接收端,再启动发送端
TCP通信程序
TcpClient.java
import java.io.*;
import java.net.*;public class TcpClient {public static void main(String[] args) {// 目标服务器IPString serverIp = "172.18.92.212";// 目标服务器端口(需与服务器端保持一致)int serverPort = 9999;// 要发送的数据String message = "这是来自TCP客户端的测试消息!";try (Socket socket = new Socket(serverIp, serverPort);OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os, true)) { // 自动刷新缓冲区// 发送数据pw.println(message);System.out.println("客户端已连接服务器,消息发送成功:" + message);} catch (UnknownHostException e) {System.err.println("目标服务器IP解析失败:" + e.getMessage());} catch (ConnectException e) {System.err.println("连接失败(可能服务器未启动/端口错误):" + e.getMessage());} catch (IOException e) {System.err.println("通信过程中发生异常:" + e.getMessage());}}
}
TcpServer.java
import java.io.*;
import java.net.*;public class TcpServer {public static void main(String[] args) {// 监听端口(需与客户端保持一致)int listenPort = 9999;try (ServerSocket serverSocket = new ServerSocket(listenPort)) {System.out.println("服务器已启动,正在监听端口 " + listenPort + " ...");// 阻塞等待客户端连接(程序会在此处暂停,直到有客户端连接)try (Socket clientSocket = serverSocket.accept()) { // 接收到连接后自动关闭clientSocketInetSocketAddress clientAddress = (InetSocketAddress) clientSocket.getRemoteSocketAddress();System.out.println("客户端连接成功!客户端地址:" + clientAddress.getAddress().getHostAddress() + ":" + clientAddress.getPort());// 获取输入流读取客户端数据InputStream is = clientSocket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));// 读取一行数据(与客户端的println对应)String receivedMessage = br.readLine();System.out.println("收到客户端消息:" + receivedMessage);} catch (IOException e) {System.err.println("客户端连接处理异常:" + e.getMessage());}} catch (IOException e) {System.err.println("服务器启动失败(可能端口被占用):" + e.getMessage());}}
}
运行
先启动服务器端,再启动客户端