开发web应用肯定要用到web服务器,那么这次就聊聊java的Tomcat服务器。
Tomcat到底是什么?
打开Tomcat官网,首先第一句话是:The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.其实第一次接触Tomcat的人是看不明白这句话的。
那我们就先来聊聊http服务器吧,以下是网上摘来的一段使用python语言、原生socket写的一个非常简单的http服务器代码:
#!/usr/bin/python
import socket
import signal
import errno
from time import sleep
def HttpResponse(header,whtml):
f = file(whtml)
contxtlist = f.readlines()
context = ''.join(contxtlist)
response = "%s %d\n\n%s\n\n" % (header,len(context),context)
return response
def sigIntHander(signo,frame):
print 'get signo# ',signo
global runflag
runflag = False
global lisfd
lisfd.shutdown(socket.SHUT_RD)
strHost = "172.20.52.163"
HOST = strHost #socket.inet_pton(socket.AF_INET,strHost)
PORT = 20014
httpheader = '''\
HTTP/1.1 200 OK
Context-Type: text/html
Server: Python-slp version 1.0
Context-Length: '''
lisfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
lisfd.bind((HOST, PORT))
lisfd.listen(2)
signal.signal(signal.SIGINT,sigIntHander)
runflag = True
while runflag:
try:
confd,addr = lisfd.accept()
except socket.error as e:
if e.errno == errno.EINTR:
print 'get a except EINTR'
else:
raise
continue
if runflag == False:
break;
print "connect by ",addr
data = confd.recv(1024)
if not data:
break
print data
confd.send(HttpResponse(httpheader,'index.html'))
confd.close()
else:
print 'runflag#',runflag
print 'Done'
这段代码很简单就是创建一个socket并进行监听,并在收到请求后返回html。
其实所有的http服务器都是如此,将原生socket进行封装并根据http协议的要求进行实现,python就有诸如BaseHTTPServer、SimpleHTTPServer这样的参考实现,它们实现了http协议里规定的一些基本功能。
那么Tomcat也是一样的,它是一款http应用服务器,当然它实现的功能要比python的BaseHTTPServer多得多,至于Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket则是它所遵循的一些技术标准因为除了Tomcat之外,java系的应用服务器还有Jetty等,为了降低大家的学习成本、方便使用,Tomcat和Jetty都遵循Java Servlet标准,这样大家在调用的时候函数名称、参数基本都是一样的,只是内部实现不同。
通过以上介绍现在我们应该明白,Tomcat和Nginx、Apache之类的Web服务器并不属于同一级别的东西,后两者放在整个服务应用的最前面它们可以对接多种后端语言开发的应用,而Tomcat显然不是用于干这些的,它往往用于开发内网的应用或者与Nginx、Apache对接做面向公网的应用。
下一篇将介绍Tomcat实现的Servlet容器。