实现 Java 面试题 TCP 和 UDP
1. 概述
在实现 Java 面试题中的 TCP 和 UDP 的过程中,我们需要按照以下步骤来进行操作:
- 创建一个服务器端和一个客户端;
- 服务器端监听指定端口并等待客户端连接;
- 客户端与服务器端建立连接;
- 服务器端接收客户端的请求,并返回响应;
- 客户端接收服务器端的响应;
- 关闭连接。
下面我们将逐步解释每一步需要做什么,以及对应的代码和注释。
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