网络通信基础

下面是UDP服务器端和客户端的实现示例:

UDP服务器端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
    public static void main(String[] args) {
        int port = 6789; // 服务器端端口

        try (DatagramSocket socket = new DatagramSocket(port)) {
            System.out.println("UDP服务器正在端口" + port + "上监听...");

            while (true) {
                byte[] buffer = new byte[1024];
                DatagramPacket request = new DatagramPacket(buffer, buffer.length);

                // 接收客户端发送的数据包
                socket.receive(request);
                String received = new String(request.getData(), 0, request.getLength());
                System.out.println("服务器收到: " + received);

                // 发送响应数据包给客户端
                String responseString = "收到消息: " + received;
                byte[] responseBuffer = responseString.getBytes();
                DatagramPacket response = new DatagramPacket(
                        responseBuffer,
                        responseBuffer.length,
                        request.getAddress(),
                        request.getPort()
                );
                socket.send(response);
            }
        } catch (SocketException e) {
            System.out.println("SocketException: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IOException: " + e.getMessage());
        }
    }
}

UDP客户端:

import java.io.IOException;
import java.net.*;

public class UdpClient {
    public static void main(String[] args) {
        String hostname = "localhost"; // 服务器主机名或IP地址
        int port = 6789; // 服务器端端口
        try (DatagramSocket socket = new DatagramSocket()) {
            socket.setSoTimeout(10000); // 设置超时时间为10秒
            InetAddress address = InetAddress.getByName(hostname);

            String message = "Hello from UDP client!";
            byte[] buffer = message.getBytes();

            DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, port);
            socket.send(request); // 发送数据包到服务器

            // 接收服务器的响应
            DatagramPacket response = new DatagramPacket(new byte[1024], 1024);
            socket.receive(response);
            String received = new String(response.getData(), 0, response.getLength());
            System.out.println("客户端收到: " + received);
        } catch (SocketException e) {
            System.out.println("SocketException: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IOException: " + e.getMessage());
        }
    }
}

在这个UDP通信示例中,服务器端创建一个DatagramSocket来监听一个特定的端口,并使用receive方法等待客户端发送的数据包。当接收到数据包后,服务器读取数据包内容,并将响应发送回客户端。

客户端同样创建一个DatagramSocket,并发送一个包含消息的DatagramPacket到服务器的IP地址和端口。然后它等待服务器的响应,并在接收到响应后打印出来。

注意,UDP通信是不可靠的,数据包可能会丢失或者顺序可能会不一致。如果需要在网络通信中确保数据的可靠性,通常会使用TCP而不是UDP。继续之前的UDP通信示例,这里将展示如何使用Java进行UDP通信的客户端和服务器端的基本实现。

UDP服务器端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) {
        int port = 4445; // 服务器监听端口
        byte[] buffer = new byte[256]; // 接收数据的缓冲区

        try (DatagramSocket socket = new DatagramSocket(port)) {
            System.out.println("Server is listening on port " + port);

            while (true) {
                // 接收数据包
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                socket.receive(packet);
                
                // 获取客户端信息
                String received = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Received from client: " + received);

                // 响应客户端
                String response = "Echo: " + received;
                byte[] responseData = response.getBytes();
                DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length,
                        packet.getAddress(), packet.getPort());
                socket.send(responsePacket);
            }
        } catch (Exception e) {
            System.out.println("Server exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

UDP客户端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) {
        // 服务器地址和端口
        String serverAddress = "localhost";
        int serverPort = 4445;
        
        try {
            // 创建UDP Socket
            DatagramSocket socket = new DatagramSocket();

            // 发送数据到服务器
            byte[] sendData = "Hello Server".getBytes();
            InetAddress serverIP = InetAddress.getByName(serverAddress);
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIP, serverPort);
            socket.send(sendPacket);

            // 接收来自服务器的响应
            byte[] receiveData = new byte[256];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            socket.receive(receivePacket);
            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Server response: " + response);

            // 关闭socket
            socket.close();
        } catch (Exception e) {
            System.out.println("Client exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

理解UDP通信:

  • UDP是一种无连接的协议,数据以数据包(Datagram)的形式发送,不保证数据包的顺序、完整性或者数据的可达性。
  • UDP适合于那些对于网络通信效率要求高、但可以容忍数据丢失的应用场景,例如实时视频流、在线游戏等。
  • 在Java中,DatagramSocket类用于发送或接收数据包,而DatagramPacket类表示数据包本身。数据包包含了数据内容、目的地地址和端口信息。

小结:

Java提供了强大的API来支持TCP和UDP网络通信,通过Socket和ServerSocket可以方便的实现TCP协议下的服务端和客户端。通过DatagramSocket和DatagramPacket实现UDP协议下的无连接通信。通过使用这些API,你可以构建复杂的网络应用程序,实现客户端和服务器之间的数据交换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值