UDP和TCP示例程序

发布于:2025-05-25 ⋅ 阅读:(20) ⋅ 点赞:(0)

查看自己的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) {
        // 目标服务器IP
        String 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()) {  // 接收到连接后自动关闭clientSocket
                InetSocketAddress 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());
        }
    }
}
    

运行

先启动服务器端,再启动客户端


网站公告

今日签到

点亮在社区的每一天
去签到