当前位置:   article > 正文

Java网络通信及Servlet常见场景实现

Java网络通信及Servlet常见场景实现

UDP

UDPServer

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. public class UDPServer {
  5. public static void main(String[] args) throws IOException {
  6. System.out.println("UdpServer启动");
  7. // 创建upd套接字
  8. DatagramSocket socket = new DatagramSocket(8080);
  9. // 获取客户端连接
  10. byte[] buffer = new byte[1024];
  11. while (true) {
  12. // 获取客户端请求
  13. DatagramPacket client = new DatagramPacket(buffer, buffer.length);
  14. socket.receive(client);
  15. String request = new String(client.getData(), 0, client.getLength());
  16. // 回显客户端
  17. String response = request;
  18. socket.send(new DatagramPacket(response.getBytes(), response.getBytes().length,
  19. client.getAddress(), client.getPort()));
  20. // 打印交互日志
  21. System.out.printf("客户端[%s:%d] receive-> %s send-> %s\n", client.getAddress().toString(),
  22. client.getPort(), request, response);
  23. }
  24. }
  25. }

UDPClient

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.util.Scanner;
  6. public class UDPClient {
  7. public static void main(String[] args) throws IOException {
  8. System.out.println("UdpClient启动");
  9. // 创建客户端套接字
  10. DatagramSocket socket = new DatagramSocket();
  11. // 创建数据报
  12. byte[] buffer = new byte[1024];
  13. DatagramPacket client = new DatagramPacket(buffer, buffer.length,
  14. InetAddress.getByName("127.0.0.1"), 8080);
  15. while (true) {
  16. // 获取发送数据
  17. System.out.print("send -> ");
  18. Scanner scanner = new Scanner(System.in);
  19. String request = scanner.next();
  20. client.setData(request.getBytes());
  21. // 发送数据
  22. socket.send(client);
  23. // 获取服务器回显数据
  24. DatagramPacket server = new DatagramPacket(buffer, buffer.length);
  25. socket.receive(server);
  26. // 打印交互日志
  27. System.out.printf("receive ->[%s:%d] %s\n", server.getAddress().toString(), server.getPort(),
  28. new String(server.getData(), 0, server.getLength()));
  29. }
  30. }
  31. }

测试结果

TCP

TCPServer

  1. import java.io.IOException;
  2. import java.io.PrintStream;
  3. import java.net.InetAddress;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. import java.util.Scanner;
  7. import java.util.concurrent.ExecutorService;
  8. import java.util.concurrent.Executors;
  9. public class TCPServer {
  10. public static void main(String[] args) throws IOException {
  11. System.out.println("TCPServer启动");
  12. // 创建监听套接字
  13. ServerSocket listenSocket = new ServerSocket(8080, 20, InetAddress.getByName("127.0.0.1"));
  14. // 创建线程池处理客户端数据
  15. ExecutorService clientPool = Executors.newCachedThreadPool();
  16. while (true) {
  17. // 获取客户端连接
  18. Socket client = listenSocket.accept();
  19. // 客户端处理
  20. clientPool.submit(() -> {
  21. try {
  22. clientProcess(client);
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. });
  27. }
  28. }
  29. public static void clientProcess(Socket client) throws IOException {
  30. System.out.printf("client[%s:%d] connect success\n",
  31. client.getInetAddress().toString(), client.getPort());
  32. // 处理客户端数据
  33. try (Scanner input = new Scanner(client.getInputStream());
  34. PrintStream output = new PrintStream(client.getOutputStream())) {
  35. while (true) {
  36. if (!input.hasNext()) {
  37. System.out.printf("client[%s:%d] disconnect\n",
  38. client.getInetAddress().toString(), client.getPort());
  39. } else {
  40. // 约定以\n为一个完整报文
  41. String request = input.nextLine();
  42. // 回显客户端
  43. String response = request;
  44. output.println(response);
  45. output.flush();
  46. // 打印交互日志
  47. System.out.printf("client[%s:%d] receive -> %s send -> %s\n",
  48. client.getInetAddress().toString(), client.getPort(), request, response);
  49. }
  50. }
  51. }
  52. }
  53. }

TCPClient

  1. import java.io.IOException;
  2. import java.io.PrintStream;
  3. import java.net.Socket;
  4. import java.util.Scanner;
  5. public class TCPClient {
  6. public static void main(String[] args) throws IOException {
  7. System.out.println("TCPClient启动");
  8. // 创建客户端连接
  9. Socket socket = new Socket("127.0.0.1", 8080);
  10. Scanner scanner = new Scanner(System.in);
  11. try (Scanner input = new Scanner(socket.getInputStream());
  12. PrintStream output = new PrintStream(socket.getOutputStream())) {
  13. while (true) {
  14. System.out.print("send -> ");
  15. String request = scanner.nextLine();
  16. // 发送请求数据
  17. output.println(request);
  18. // 获取服务器回显数据
  19. String response = input.nextLine();
  20. // 打印交互日志
  21. System.out.printf("receive -> server[%s:%d] %s\n",
  22. socket.getInetAddress().toString(), socket.getPort(), response);
  23. }
  24. }
  25. }
  26. }

测试结果

Servlet 

项目搭建

pom文件引入依赖与打包配置

  1. <dependencies>
  2. <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  3. <dependency>
  4. <groupId>javax.servlet</groupId>
  5. <artifactId>javax.servlet-api</artifactId>
  6. <version>3.1.0</version>
  7. <scope>provided</scope>
  8. </dependency>
  9. <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  10. <dependency>
  11. <groupId>com.fasterxml.jackson.core</groupId>
  12. <artifactId>jackson-databind</artifactId>
  13. <version>2.16.2</version>
  14. </dependency>
  15. </dependencies>
  16. <packaging>war</packaging>
  17. <build>
  18. <finalName>hello</finalName>
  19. </build>

目录结构创建

web.xml写入配置

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app></web-app>

idea配置tomcat

普通接口

  1. import com.fasterxml.jackson.databind.json.JsonMapper;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/test")
  9. public class HelloServlet extends HttpServlet {
  10. long count = 0;
  11. @Override
  12. public void init() throws ServletException {
  13. new Thread(() -> {
  14. while (true) {
  15. count++;
  16. try {
  17. Thread.sleep(1000);
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }).start();
  23. }
  24. @Override
  25. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  26. String username = req.getParameter("username");
  27. String password = req.getParameter("password");
  28. System.out.println("username = " + username + ", password = " + password);
  29. resp.setContentType("text/html; charset=utf8");
  30. resp.setStatus(200);
  31. resp.setHeader("refresh", "1");
  32. resp.getWriter().write("success " + count);
  33. }
  34. static class Customer {
  35. public String username;
  36. public String password;
  37. }
  38. static class ResponseMessage {
  39. public Integer status;
  40. }
  41. @Override
  42. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  43. JsonMapper jsonMapper = new JsonMapper();
  44. // 入参映射转换
  45. // Customer customer = jsonMapper.readValue(req.getInputStream(), Customer.class);
  46. // 读取入参报文
  47. StringBuilder request = new StringBuilder();
  48. // 读取方式一
  49. // String line;
  50. // while ((line = req.getReader().readLine()) != null) {
  51. // request.append(line);
  52. // }
  53. // 读取方式二
  54. byte[] requestBuffer = new byte[1024];
  55. int length;
  56. while ((length = req.getInputStream().read(requestBuffer, 0, requestBuffer.length)) > 0) {
  57. request.append(new String(requestBuffer, 0, length));
  58. }
  59. // 组织出参报文,需要注意body的write一定要放在最后一行,否则resp上面设置的会失效(Servlet bug)
  60. resp.setContentType("application/json; charset=utf8");
  61. resp.setStatus(200);
  62. ResponseMessage responseMessage = new ResponseMessage();
  63. responseMessage.status = 200;
  64. String response = jsonMapper.writeValueAsString(responseMessage);
  65. resp.getWriter().write(response);
  66. System.out.println("request: " + request + "\n" + "response: " + response);
  67. }
  68. }

JDBC接口

引入JDBC依赖

  1. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>5.1.49</version>
  6. </dependency>

代码示例

  1. import com.fasterxml.jackson.databind.json.JsonMapper;
  2. import com.mysql.jdbc.StringUtils;
  3. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.sql.DataSource;
  10. import java.io.IOException;
  11. import java.sql.Connection;
  12. import java.sql.PreparedStatement;
  13. import java.sql.ResultSet;
  14. import java.sql.SQLException;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. @WebServlet("/jdbc")
  18. public class JDBCServlet extends HttpServlet {
  19. DataSource dataSource;
  20. @Override
  21. public void init() throws ServletException {
  22. dataSource = new MysqlDataSource();
  23. ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
  24. ((MysqlDataSource) dataSource).setUser("root");
  25. ((MysqlDataSource) dataSource).setPassword("root");
  26. }
  27. static class User {
  28. public String username;
  29. public String password;
  30. }
  31. @Override
  32. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  33. List<User> userList = new ArrayList<>();
  34. try (Connection connection = dataSource.getConnection();
  35. PreparedStatement statement = connection.prepareStatement("select * from user");
  36. ResultSet resultSet = statement.executeQuery()) {
  37. while (resultSet.next()) {
  38. User user = new User();
  39. user.username = resultSet.getString("username");
  40. user.password = resultSet.getString("password");
  41. userList.add(user);
  42. }
  43. } catch (SQLException | NullPointerException e) {
  44. e.printStackTrace();
  45. }
  46. JsonMapper jsonMapper = new JsonMapper();
  47. String response = jsonMapper.writeValueAsString(userList);
  48. resp.getWriter().write(response);
  49. }
  50. @Override
  51. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  52. JsonMapper jsonMapper = new JsonMapper();
  53. User user = jsonMapper.readValue(req.getInputStream(), User.class);
  54. if (StringUtils.isEmptyOrWhitespaceOnly(user.username) || StringUtils.isEmptyOrWhitespaceOnly(user.password)) {
  55. resp.getWriter().write("body invalid");
  56. return;
  57. }
  58. String message = "fail";
  59. try (Connection connection = dataSource.getConnection();
  60. PreparedStatement statement = connection.prepareStatement("insert into user values(null,?,?)")) {
  61. statement.setString(1, user.username);
  62. statement.setString(2, user.password);
  63. int resultCount = statement.executeUpdate();
  64. if (resultCount > 0) {
  65. message = "success";
  66. }
  67. } catch (SQLException e) {
  68. e.printStackTrace();
  69. }
  70. resp.getWriter().write(message);
  71. }
  72. }

Cookie及Session接口

Servlet已默认实现及提供了相关接口,直接使用即可。

代码示例

  1. import com.mysql.jdbc.StringUtils;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9. import java.io.IOException;
  10. @WebServlet("/session")
  11. public class SessionServlet extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. String username = req.getParameter("username");
  15. String password = req.getParameter("password");
  16. resp.setContentType("text/html; charset=utf8");
  17. if (StringUtils.isEmptyOrWhitespaceOnly(username) || StringUtils.isEmptyOrWhitespaceOnly(password)) {
  18. resp.getWriter().write("parameter invalid");
  19. return;
  20. }
  21. // 创建Session,这个方法会无论session是否存在都会自动创建session对象,并且会把sessionId设置到响应头中
  22. HttpSession session = req.getSession(true);
  23. session.setAttribute("username", username);
  24. session.setAttribute("password", password);
  25. // 添加一个cookie
  26. resp.addCookie(new Cookie("test", "111"));
  27. resp.sendRedirect("login");
  28. }
  29. }

响应返回头中设置了两个Cookie。

 重定向的请求头中多了Cookie的两个参数。

重定向代码示例

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.Cookie;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/login")
  10. public class LoginServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. HttpSession session = req.getSession(false);
  14. resp.setContentType("text/html; charset=utf8");
  15. if (session == null) {
  16. resp.getWriter().write("access invalid");
  17. return;
  18. }
  19. String username = (String) session.getAttribute("username");
  20. String password = (String) session.getAttribute("password");
  21. for (Cookie cookie : req.getCookies()) {
  22. System.out.println(cookie.getName() + ":" + cookie.getValue());
  23. }
  24. resp.getWriter().write(username + "&" + password + " login success");
  25. }
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/735446
推荐阅读
相关标签
  

闽ICP备14008679号