Servlet&JSP学习系列(1) - 简单的一个WebServer实现

一直从事着.NET的桌面应用程序开发,直到1月份考完研,因为想找一份Java的工作,开始疯狂的看Java方面的书和视频,Java编程思想、SSH之类的,乱七八糟的信息都往脑子里塞。发现只是在看的时候记住了,当真正到做了却一头雾水,基本功不够扎实啊。

从复试结束以后,工作也不想换了,就几个月的时间,那就忍忍吧,所以就打算从基础做起,把基本功打扎实了,然后像高层的框架进军。谨遵老大的教诲,看书一定要看经典的书,因为我们并没有多少时间可以浪费在一些比较差的书上,因而在亚马逊上搜到了coreservlet(Servlet与JSP核心编程)这本书是Servlet和JSP相关的比较经典的书。看完以后确实发现写的很好。打算再看一遍,写写一些事例加深印象。

学一项技术,如果能深入到内部实现的话,那才能说对这项技术有真正的掌握。因而学Servlet,对HTTP协议,Web服务器内部运行机制一定需要有一个透彻的了解。

受coreservlet的影响,我也尝试着自己写了一个简单的WebServer,这个Server很简单,把浏览器传输过来的请求分类以表格的形势打印。

代码比较简单:
基类NetworkServer中,开始服务器在某个端口的监听,当客户端连接请求到来的时候,对到来的连接Socket进行处理:
	public void listen() {
		listener = new ServerSocket(port);
		// Listener on the port for ever unless you shut it down manually.
		while(true) {
			Socket server = listener.accept();
			handleConnection(server);
		}
	}


在处理的时候,根据到来的是GET、POST、PUT、DELETE等请求,用不同的类来处理:
	public void handleConnection(Socket server) {
		try {
			BufferedReader reader = SocketUtils.getReader(server);
			PrintWriter writer = SocketUtils.getWriter(server);
			printResponseHeader(writer);
			printPageContentHeader(writer);
			
			String commandLine = reader.readLine();
			if(null == commandLine) {
				printErrorMsg(writer, "Invalid request : no command data exists.");
				return;
			}
			
			RequestHandler handler = null;
			if(commandLine.toUpperCase().startsWith("GET"))
				handler = new GetRequestHandler();
			else if(commandLine.toUpperCase().startsWith("POST"))
				handler = new PostRequestHandler();
			else if(commandLine.toUpperCase().startsWith("PUT"))
				handler = new PutRequestHandler();
			else if(commandLine.toUpperCase().startsWith("DELETE"))
				handler = new DeleteRequestHandler();
			else {
				printErrorMsg(writer, "Invalid request method");
				return;
			}
			
			handler.service(reader, writer, commandLine);
			
			printPageContentTail(writer);
		}catch(IOException e) {

		}
	}


在具体的处理的时候,将HTTP请求分为三部分,请求命令信息,请求头以及请求的内容分成三个表格。在处理的时候需要注意两点:
1. Get命令的请求内容是在命令行(第一行)中,并且它的内容有可能为空。
2. Post命令的数据是在请求头之后(中间有一个空行),对这些数据需要用read函数,而不能用readLine函数。

主要就是这些了,PUT和DELETE命令还没有实现,另,很多类型也没能考虑,比如文件上传,图片,MINE的不同类型等,这些还不知道HTTP的格式,因而还不知道怎么处理,请求内容的编码问题也没有考虑。过几天再研究研究HTTP协议的具体内容。

有兴趣的人可以看看附件的源码。因为时间的问题,没能很好的设计代码的结构,希望有时间能对这个的功能和设计上有一些改进。

虽然以上代码的基本框架还是源于书本上的内容,但是发现自己实现一遍以后,对HTTP的协议会了解的比较深刻,而且对Web服务器也不再感觉很深奥了。事实上我现在认为(浅显的认为,不知道对还是不对,望高人能够指教 ),Web服务器就是一种TCP的编程,对接收到的HTTP数据进行一些处理,然后以HTTP协议的格式将处理完的数据返回给客户端。

最后,我发现我只是一个简单的form页面,都会有两次请求,一次是正常的请求,还有一次是:GET /favicon.ico HTTP/1.1
而这个请求又不会影响浏览器的显示,不知道这个是做什么用的,我原本以为是和浏览器相关的,开始我用chrome,后来换成IE8还是有这个请求。继续希望高人指教。先谢过

你可能感兴趣的:(编程,jsp,应用服务器,servlet,socket)