上次聊了计算机网络,好比你去外地去做一件什么事,网络就是你到达那个地方的方式和过程。而到了目的地之后,又怎么办呢。
叫做进入到目的地场所“办事儿”。
这个场所有很多种类,但基本都提供一些基本功能。比如当饭店的人看到你过来,会问你打尖还是住店,这就好比从tcp或者udp这里把二进制的数据搞成文本,可以阅读了。
饭店早已经在那里,饭店里面应该有行李部,餐饮部,客房部,后勤部等等,其实每个部都代表一个Servlet。当启动一个tomcat,部署一个饭店应用,好比在虚拟世界建造了一个饭店。然后就创建了各个部门的servlet对象,就是每个部,每个部里面都有服务员,就是service,service是线程方式的,而tomcat和servlet就是进程方式。
java作为一门更高级的语言,相比C语言来说,确实有很多工作已经提前做了。如果要在C语言那里做一个服务器,需要编程一段,里面有很多低阶的函数,例如socket,read,write等,这些都是操作系统内核提供的,也就是比硬件接口高那么一两个等级。。而不是tomcat那样拿来即用的代码。但是tomcat,包括java的底层实现,都是C语言或者c++,或者编译语言的。例如下面这段代码,里面到底是ipv4还是ipv6,端口号多少,客户说哪国语言,所有细节都需要敲定。
- int main (int argc, char *argv[])
- {
- int fd = -1;
- int port = SERV_PORT;
-
- port = atoi (argv[2]);
- if (port < 0 || (port > 0 && port <= 5000)) {
- usage (argv[0]);
- exit (1);
- }
- struct sockaddr_in sin;
- if (argc != 3) {
- usage (argv[0]);
- exit (1);
- }
-
- /* 1. 创建socket fd */
- if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { //UDP编程
- perror ("socket");
- exit (1);
- }
-
- /*2.1 填充struct sockaddr_in结构体变量 */
- bzero (&sin, sizeof (sin));
-
- sin.sin_family = AF_INET;
- sin.sin_port = htons (SERV_PORT); //网络字节序的端口号
- #if 0
- sin.sin_addr.s_addr = inet_addr (argv[1]);
- #else
- if (inet_pton (AF_INET, argv[1], (void *) &sin.sin_addr) != 1) {
- perror ("inet_pton");
- exit (1);
- }
- #endif
- printf ("multicast started!\n");
- char buf[BUFSIZ];
- while (1) {
- fprintf (stderr, "pls input string:");
- bzero (buf, BUFSIZ);
- if (fgets (buf, BUFSIZ - 1, stdin) == NULL) {
- perror ("fgets");
- continue;
- }
-
- sendto (fd, buf, strlen (buf), 0, (struct sockaddr *) &sin, sizeof (sin));
-
- if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) { //用户输入了quit字符
- printf ("Client is exited!\n");
- break;
- }
-
- }
- close (fd);
- return 0;
- }
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("
一切复杂的细节都给你包装到两个对象,一个叫做HttpServletRequest req,另一个叫作HttpServletResponse resp,用白话解释,就是客户的req,请求是怎么打尖,怎么住店,吃几个碟,要几个洗脚的,要几个搓背的,都在resp里面已经规定好了,team work。