Tomcat原理学习---Socket类

来源:互联网 发布:java web war包混淆 编辑:程序博客网 时间:2024/05/17 07:34
java.net.Socket类:
套接字Socket类是网络连接的一个端点,可以让一个应用从网络中读取和写入数据. 
其中一个构造方法:接收主机名称和端口号:
public(java.lang.String host,int port),如:new Socket("yahoo.com",8080)
可以通过Socket类的getOutputStream方法来获取java.io.OutputStream对象
可以通过Socket类的getInputStream方法来获取java.io.InputStream对象
可以通过返回的OutputStream对象中构造一个java.io.PrintWriter对象来发送文本到一个远程应用。
java.net.ServerSocket类:
随时等待来自客户端的连接请求,一旦获得请求,就会创建一个Socket实例来与客户端通信。
serverSocket = new ServerSocket(8080,1,InetAddress.getByName("172.0.0.1"));
Socket socket = null;
socket = serverSocket.accept();


public ServerSocket(int port,int backLog,InetAddress bindingAddress),如:new ServerSocket(8080,1,InetAddress.getByName("172.0.0.1"));  监听本地机器


我们的web服务器应用程序放在ex01.pyrmont包里面,由3个类组成:HttpServer、Request、Response


HttpServer类:
await方法:通过parse和parseUri方法获取http请求,当socket关闭后判断请求是否为shutdown,是则退出while循环


Request类:
调用InputStream对象其中一个read方法来获取HTTP请求的原始数据。Request对象有两个公共方法:parse、getUri
parse方法:
解析了HTTP请求里面的原始数据,通过调用HTTP请求的私有方法parseUri获得URI.
parseUri方法:
parseUri方法在uri变量里边存储URI。公共方法gerUri被调用并返回HTTP请求的URI。


细分:parse方法从传递给Request对象的socket的InputStream中读取整个字节流并在一个缓冲区中存储字节数组。然后它使用缓存区字节数据的字节来填入一个StringBuffer对象,并且把代表StringBuffer的字符串传递给parseUri方法。然后parseUri方法搜索请求里面的第一个和第二个空格并从中获得URI。


Response类:
有两个公共方法:setRequest、sendStaticResource
setRequest方法:
用来传递一个Requst对象给Response对象
sendStaticResource方法:
用来发送一个静态资源,例如一个HTML文件。
它首先通过传递上一级目录的路径和子路径给File类的构造方法来实例化File类。然后检查该文件是否存在,如果存在,则通过传递的file创建FileInputStream对象,调用read方法来把字节数组写入OutputStream对象。否则,sendStaticResource发送一个错误信息到浏览器。(如4:404)
注意:sendStaticResource方法是以原始数据发送给浏览器的。


个人总结:
HttpServer类,await方法通过ServerSocket的accept方法来创建socket,socket通过getInputStream将数据传给request并以request的parse方法进行解析,再将request对象设置给创建的response,并调用它的sendStaticResource方法。
(inputStream、outputStream:getInputStream是从socket中得到数据,getOutputStream是以字节的形式将信息发送到socket)
0 0
原创粉丝点击