实现 Java 面试题 TCP 和 UDP

1. 概述

在实现 Java 面试题中的 TCP 和 UDP 的过程中,我们需要按照以下步骤来进行操作:

  1. 创建一个服务器端和一个客户端;
  2. 服务器端监听指定端口并等待客户端连接;
  3. 客户端与服务器端建立连接;
  4. 服务器端接收客户端的请求,并返回响应;
  5. 客户端接收服务器端的响应;
  6. 关闭连接。

下面我们将逐步解释每一步需要做什么,以及对应的代码和注释。

2. 服务器端代码

首先,我们需要创建一个服务器端来监听指定端口并等待客户端连接。以下是一个简单的服务器端代码示例:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        // 创建一个服务器端Socket,指定监听端口
        ServerSocket serverSocket = new ServerSocket(8888);

        // 监听客户端的连接请求
        Socket socket = serverSocket.accept();

        // 获取输入流,用于接收客户端发送的数据
        InputStream inputStream = socket.getInputStream();
        // 获取输出流,用于向客户端发送数据
        OutputStream outputStream = socket.getOutputStream();

        // 读取客户端发送的数据
        byte[] buffer = new byte[1024];
        int length = inputStream.read(buffer);
        String message = new String(buffer, 0, length);
        System.out.println("接收到客户端的请求:" + message);

        // 向客户端发送响应
        String response = "Hello, Client!";
        outputStream.write(response.getBytes());

        // 关闭连接
        inputStream.close();
        outputStream.close();
        socket.close();
        serverSocket.close();
    }
}

上述代码中,我们首先创建了一个 ServerSocket 对象,并指定了监听的端口为 8888。然后,通过 accept() 方法等待客户端的连接请求,一旦有客户端连接进来,就会返回一个 Socket 对象。

接着,我们获取了该连接的输入流和输出流,用于与客户端进行数据交互。通过读取输入流中的数据,我们可以获取到客户端发送的请求消息。然后,我们向客户端发送响应消息,将其转换为字节数组并写入输出流中。

最后,我们需要关闭连接,依次关闭输入流、输出流、Socket 对象和 ServerSocket 对象。

3. 客户端代码

接下来,我们需要创建一个客户端来连接服务器端并发送请求。以下是一个简单的客户端代码示例:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        // 创建一个客户端Socket,并指定服务器端的IP地址和端口号
        Socket socket = new Socket("localhost", 8888);

        // 获取输入流,用于接收服务器端发送的数据
        InputStream inputStream = socket.getInputStream();
        // 获取输出流,用于向服务器端发送数据
        OutputStream outputStream = socket.getOutputStream();

        // 向服务器端发送请求
        String request = "Hello, Server!";
        outputStream.write(request.getBytes());

        // 读取服务器端发送的数据
        byte[] buffer = new byte[1024];
        int length = inputStream.read(buffer);
        String response = new String(buffer, 0, length);
        System.out.println("接收到服务器端的响应:" + response);

        // 关闭连接
        inputStream.close();
        outputStream.close();
        socket.close();
    }
}

上述代码中,我们首先创建了一个客户端的 Socket 对象,并指定了服务器端的 IP 地址为 localhost,端口号为 8888

然后,我们通过该 Socket 对象获取了输入流和输出流,用于与服务器端进行数据交互。我们通过输出流向服务器端发送请求消息,将其转换为字节数组并写入输出流中。

接着,我们通过输入流读取服务器端发送的响应消息,并将其转换为字符串进行展示。

最后,我们需要关闭连接,依次关闭输入流、输出流和 Socket 对象。

4. 状态图

下面是一个简单的状态图,展示了服务器端和客户端之间的交互过程。

stateDiagram