最近这段时间回顾了一下JAVA基础,到了网络编程的socket这一章,进而想到最常见的服务器tomcat,于是就开始深入学习tomcat。
对于浏览器访问页面这个过程,简单的来说的,浏览器发出请求,然后服务器接受请求作出响应,最后浏览器将响应的结果展示给用户。再往底层深入一下,浏览器与服务器之间的信息交换,将请求与响应的内容依照一种协议的格式进行编排,然后在网络中通过传输一个一个的比特流来实现的。到这里,就有思路了,利用JAVA的IO流对请求进行解析,然后响应,返回结果。这里需要注意的是,http请求报文不同项之间,要用\\r\\n进行分割,然后对得到的IO流进行解析。
大致做法就是利用SoecketServer对端口进行监听,得到Socket对象,然后拿到输入流,解析报文,响应请求,然后再拿到Socket对象的输出流返回响应报文。
以下为代码:
package com.chenx.simple.listener;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleListener {
public final static int port = 8888;//端口
/**
* 监听开始方法
*/
public void start() {
try {
ServerSocket ss = new ServerSocket(port);//建立服务监听
Socket aSocket = ss.accept();//开始监听端口
System.out.println("the remote address is : "+ aSocket.getRemoteSocketAddress());//打印发出请求的端口
DataOutputStream dos = new DataOutputStream(aSocket.getOutputStream());//得到请求的输出流
/* 以下代码向输出流中写响应内容 */
dos.writeBytes("HTTP/1.1 200 OK \r\n");
dos.writeBytes("Server: Microsoft-IIS/4.0\r\n");
dos.writeBytes("Date: Mon, 5 Jan 2004 13:13:33 GMT\r\n");
dos.writeBytes("Content-Type: text/html\r\n");
dos.writeBytes("Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT\r\n");
dos.writeBytes("Content-Length: 109\r\n");
dos.writeBytes("\r\n");
dos.writeBytes("<HTML>\r\n");
dos.writeBytes("<HEAD>\r\n");
dos.writeBytes("<title>HTTP Response Example</title>\r\n");
dos.writeBytes("</HEAD>\r\n");
dos.writeBytes("<BODY>\r\n");
dos.writeBytes("Welcome to SimpleCat\r\n");
dos.writeBytes("</BODY>\r\n");
dos.writeBytes("</HTML>");
dos.writeBytes("\r\n");
/* 响应结束 */
dos.close();//关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SimpleListener sl = new SimpleListener();
sl.start();
}
}
在
Java
环境下,
Socket
编程主要是指基于
TCP/IP
协议(HTTP协议是TCP/IP协议中的一员)的网络编程,
但是Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。我们可以把socket看做是TCP/IP协议的实现类,这里便体现了面向对象语言的优势,不需要关心底层的具体实现,只需要使用底层提供的接口。
另外,对tomcat的另外一种定义是web容器,不仅可以实现响应请求,还实现了JSP标准,支持servlet(类似的还有jetty)。所以学习tomcat,了解jsp与servlet才是学习tomcat的精髓。