• 再看tomcat的体会


    计算机网络的类比_数字公民某杨的博客-CSDN博客

    上次聊了计算机网络,好比你去外地去做一件什么事,网络就是你到达那个地方的方式和过程。而到了目的地之后,又怎么办呢。

    叫做进入到目的地场所“办事儿”。

    这个场所有很多种类,但基本都提供一些基本功能。比如当饭店的人看到你过来,会问你打尖还是住店,这就好比从tcp或者udp这里把二进制的数据搞成文本,可以阅读了。

    饭店早已经在那里,饭店里面应该有行李部,餐饮部,客房部,后勤部等等,其实每个部都代表一个Servlet。当启动一个tomcat,部署一个饭店应用,好比在虚拟世界建造了一个饭店。然后就创建了各个部门的servlet对象,就是每个部,每个部里面都有服务员,就是service,service是线程方式的,而tomcat和servlet就是进程方式。

    java作为一门更高级的语言,相比C语言来说,确实有很多工作已经提前做了。如果要在C语言那里做一个服务器,需要编程一段,里面有很多低阶的函数,例如socket,read,write等,这些都是操作系统内核提供的,也就是比硬件接口高那么一两个等级。。而不是tomcat那样拿来即用的代码。但是tomcat,包括java的底层实现,都是C语言或者c++,或者编译语言的。例如下面这段代码,里面到底是ipv4还是ipv6,端口号多少,客户说哪国语言,所有细节都需要敲定。

    1. int main (int argc, char *argv[])
    2. {
    3. int fd = -1;
    4. int port = SERV_PORT;
    5. port = atoi (argv[2]);
    6. if (port < 0 || (port > 0 && port <= 5000)) {
    7. usage (argv[0]);
    8. exit (1);
    9. }
    10. struct sockaddr_in sin;
    11. if (argc != 3) {
    12. usage (argv[0]);
    13. exit (1);
    14. }
    15. /* 1. 创建socket fd */
    16. if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { //UDP编程
    17. perror ("socket");
    18. exit (1);
    19. }
    20. /*2.1 填充struct sockaddr_in结构体变量 */
    21. bzero (&sin, sizeof (sin));
    22. sin.sin_family = AF_INET;
    23. sin.sin_port = htons (SERV_PORT); //网络字节序的端口号
    24. #if 0
    25. sin.sin_addr.s_addr = inet_addr (argv[1]);
    26. #else
    27. if (inet_pton (AF_INET, argv[1], (void *) &sin.sin_addr) != 1) {
    28. perror ("inet_pton");
    29. exit (1);
    30. }
    31. #endif
    32. printf ("multicast started!\n");
    33. char buf[BUFSIZ];
    34. while (1) {
    35. fprintf (stderr, "pls input string:");
    36. bzero (buf, BUFSIZ);
    37. if (fgets (buf, BUFSIZ - 1, stdin) == NULL) {
    38. perror ("fgets");
    39. continue;
    40. }
    41. sendto (fd, buf, strlen (buf), 0, (struct sockaddr *) &sin, sizeof (sin));
    42. if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) { //用户输入了quit字符
    43. printf ("Client is exited!\n");
    44. break;
    45. }
    46. }
    47. close (fd);
    48. return 0;
    49. }

    java语言就是屏蔽了很多这些和底层打交道的工作,直接面向应用本身了,专注的是我怎么给你打尖,怎么服务你的住店,而不是说做很多前台基本工作了。比较一下下面这段java代码:

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;

    public class HelloWorld extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter pw = resp.getWriter();
            pw.println("");
            pw.println("");
            pw.println("");
            pw.println("");
            pw.println("Document");
            pw.println("");
            pw.println("");
            pw.println("HelloWorld");
            pw.println("");
            pw.println(";
            pw.flush();
            pw.close();
        }
    }

    一切复杂的细节都给你包装到两个对象,一个叫做HttpServletRequest req,另一个叫作HttpServletResponse resp,用白话解释,就是客户的req,请求是怎么打尖,怎么住店,吃几个碟,要几个洗脚的,要几个搓背的,都在resp里面已经规定好了,team work。

  • 相关阅读:
    CentOS7管理防火墙及开放指定端口
    [C++]为什么invertmap运用到map的每个循环需要check?
    3分钟看懂设计模式02:观察者模式
    Linux:Mac VMware Fusion13以及CentOS7安装包
    口袋参谋:99.99%商家都学的防骗技巧!
    1700*C. Mixing Water(数学 | 二分)
    亚马逊平台的优势有哪些?
    数据湖在爱奇艺数据中台的应用
    程序人生:不积跬步无以致千里
    设计模式——10. 组合模式
  • 原文地址:https://blog.csdn.net/m0_47161778/article/details/126128369