1. 转发与重定向的区别
-
定义
- 转发:服务器内部的一种请求处理方式,当客户端向服务器发送请求后,服务器将该请求转发到另一个资源(如 JSP、Servlet)进行处理,整个过程在服务器端完成,客户端并不知道请求被转发,且使用的是同一个请求对象和响应对象。
- 重定向:服务器向客户端发送一个状态码(通常为 302)和一个新的 URL,客户端接收到后会重新向新的 URL 发送请求,这是两个独立的请求。
-
要点
- 地址栏变化:转发时地址栏不会改变,重定向会改变。
- 数据共享:转发可共享请求中的数据,重定向无法直接共享,若要共享需借助 session 等。
- 性能:转发性能较好,是服务器内部操作;重定向涉及客户端和服务器多次交互。
-
应用
- 转发:常用于 MVC 架构中,控制器将请求转发给视图进行渲染。例如在 Spring MVC 里,控制器接收请求后,将其转发到 JSP 页面。
- 重定向:可避免表单重复提交问题,如用户注册成功后重定向到登录页面。
Java 代码示例
java
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 转发示例
@WebServlet("/forwardExample")
public class ForwardExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher dispatcher = req.getRequestDispatcher("/target.jsp");
dispatcher.forward(req, resp);
}
}
// 重定向示例
@WebServlet("/redirectExample")
public class RedirectExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.sendRedirect("/target.jsp");
}
}
2. TCP 与 UDP 区别
-
定义
- TCP:面向连接的传输协议,在传输数据前需建立连接,传输完成后断开连接。通过三次握手建立连接,四次挥手断开连接,保证数据可靠传输。
- UDP:无连接的传输协议,无需建立连接,直接发送数据,不保证数据可靠传输和顺序。
-
要点
- 可靠性:TCP 可靠,UDP 不可靠。
- 连接性:TCP 面向连接,UDP 无连接。
- 效率:UDP 效率高,无需建立和断开连接;TCP 效率相对较低。
- 应用场景:TCP 适用于对数据准确性要求高的场景,UDP 适用于对实时性要求高的场景。
-
应用
- TCP:常用于文件传输、网页浏览、数据库连接等场景。例如 Java 应用程序通过 JDBC 连接数据库时使用 TCP 协议。
- UDP:适用于视频直播、游戏、物联网设备通信等对实时性要求高的场景。
Java 代码示例
java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
// TCP 服务器示例
class TCPServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8888)) {
System.out.println("TCP Server is listening on port 8888");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String message = new String(buffer, 0, bytesRead);
System.out.println("Received: " + message);
OutputStream outputStream = socket.getOutputStream();
String response = "Message received";
outputStream.write(response.getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// TCP 客户端示例
class TCPClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8888)) {
OutputStream outputStream = socket.getOutputStream();
String message = "Hello, Server!";
outputStream.write(message.getBytes());
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String response = new String(buffer, 0, bytesRead);
System.out.println("Received from