加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

Java搭建Web服务器之Socket编程,理解 Apache、Tomcat

发布时间:2020-03-06 19:55:14 所属栏目:电商 来源:站长网
导读:副标题#e# 之前做web应用一直是在本地装个Apache、Tomcat之类的软件,然后把做好的网页文件放在他们的工作目录下(如Apache的htdocs),然后打开浏览器输入127.0.0.1或localhost就可以直接访问了,好神奇,可是为什么,怎么实现的呢,早就知道有Socket(套接字

好了,服务器端的代码咱们写完了,那接下来干啥?不知道。。。不过还记得刚才提出的问题吗——“可是我还是不明白为什么在浏览器里输入127.0.0.1之后就可以看到我的网页了?”那就试试呗,看看咱们如果在浏览器里输入127.0.0.1或者localhost会怎么样

首先必须把刚才咱们编写的服务器端程序运行起来,然后再打开浏览器,记住,必须先运行服务器端程序,不然情书就发丢了。。。运行服务器端程序,如图:

Java搭建web服务器之Socket编程,更好的理解 Apache、Tomcat

注意红圈中的两点:由于此时没有客户端发来情书,还记得刚才的accept()阻塞方法吗,它就一直等啊等,等不来我还等,所以红圈中会显示“正在等待情书中…”;那么右面那个箭头指向的是什么意思呢,一个红色停止的图标,也就是说,这个程序现在一直在执行着,没有结束,就好像死循环一样(当然这里绝对不是死循环,其实是阻塞,只是死的样子好像死循环,一会咱们会谈到死循环的,别着急,迟早会死的)

接下来打开浏览器,在地址栏输入127.0.0.1/index.html后回车,看看浏览器什么反应。。。。。一段时间过去了,浏览器居然一点反应都没有,然后告诉我该页无法显示。我去。。。难道讲了这么多咱们就这么失败了吗,我哭。那就打开eclipse看一眼吧,看看服务器端有没有什么动静啊。打开服务器端一看,卧槽,瞬间世界向我问好了!

Java搭建web服务器之Socket编程,更好的理解 Apache、Tomcat

注意看红笔标注,我收到了情书!我要开始解析了!那到底情书里是什么内容,别问我,继续向下看。“好熟悉的一段报文,我们好像在哪见过,还记得吗,那是一个春天,你刚发芽儿。。。”没错,这就是计算机网络原理讲的http请求报文。没有学过计网怎么办,没关系,看前两行(其实我们一会用到的也只有第一行而已),“我看到了index.html” 是的,这是刚才我们在浏览器里面输入的地址;第二行,“我也看到了127.0.0.1”,是的,也是我们刚刚在浏览器里面输入的。这说明了什么?激动的我无法说出这到底说明了什么,但想必读者你已经揣测出了什么。

写到这里,作为服务器的我已经收到了从客户端发来的情书,那客户端(浏览器)为什么一点反应都没有呢,甚至过了一会就“该页无法显示”了。因为啊,人家给你写了情书,你没回复人家,人家等了一会觉得没戏了就伤心欲绝了!是啊,喜不喜欢人家都要和他说一声的,给他个答复,哪怕只说:“对不起,你是个好人。。。”

走神了吧?好像说到自己了吧?回来吧,咱们现在的任务呢,就是怎么给人家个答复。

怎么给,怎么给,怎么给。。。快想快想,既然人家都指明了想和127.0.0.1里的“index.html”表白,那当然就得由index.html来给他答复喽。怎么答,怎么答,怎么答。。。快想快想,既然index.html是个文件,那我读出文件内容后直接发给客户端不就行了吗?可是用什么发?没错,是socket!我们用socket把文件的内容返回给客户端就好了。

那么问题来了。。。“说的非常好,关键是怎么做!”——首先怎么读出文件来?

假定咱们的index.html在我电脑的E://课件/计算机网络原理/实验/实验1/ 文件夹下,并且假定不会跨域访问,则:

1、定义一个字符串,用来存咱们的工作目录

String base_url = "E://课件/计算机网络原理/实验/实验1/";  

//这只是我本机的目录,至于到了你的电脑上,你可以自己更改</span>  

2、我怎么通过报文知道客户端要和index.html表白?看情书第一行 GET /index.html HTTP/1.1,所以只需要获取情书的第一行字符串并解析出index.html就好办啦,easy,开始吧

//由于目前只需要第一行,所以咱们就不像上面那样循环读取了,读一行就够了  

String line = reader.readLine();  

//用字符串截取函数,把“index.html”这个字符串给揪出来 

String url = line.substring(5, line.indexOf("HTTP") - 1);  

3、所以咱们index.html的绝对路径就是 base_url + url 了,终于把我爱的人从人山人海中找到了,看看她怎么答复我吧——获取文件内容

inputStream = new FileInputStream(base_url + url);  

OutputStream outputStream = socket.getOutputStream(); //我要从服务器给客户端答复了,对于服务器来说,这是发出去的内容,所以是Out!  

byte[] buffer = new byte[4 * 1024]; //定义字节缓冲区  

int len = 0;  

while ((len = inputStream.read(buffer)) != -1) {  

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读