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

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

发布时间:2020-03-07 06:17:21 所属栏目:系统 来源:站长网
导读:副标题#e# 之前做web应用一直是在本地装个Apache、Tomcat之类的软件,然后把做好的网页文件放在他们的工作目录下(如Apache的htdocs),然后打开浏览器输入127.0.0.1或localhost就可以直接访问了,好神奇,可是为什么,怎么实现的呢,早就知道有Socket(套接字
副标题[/!--empirenews.page--] 之前做web应用一直是在本地装个Apache、Tomcat之类的软件,然后把做好的网页文件放在他们的工作目录下(如Apache的htdocs),然后打开浏览器输入127.0.0.1或localhost就可以直接访问了,好神奇,可是为什么,怎么实现的呢,早就知道有Socket(套接字)这个东西,可之前就是没有把这两方面结合起来,今天我们就一起来看一看这究竟是为什么。

有同学说还不懂Socket是什么,这东西很抽象,在计算机网络原理里讲协议时才会看到,今天咱们完全忽略太严谨、学术的定义,就来看看Socket到底是什么。

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

想象一下,你把电脑的电源插在插座上,你的电脑就可以使用了,为什么?“这不是废话吗!”确实,咱们来想一下这个过程,你拿着插头插在了插座上,然后你的电脑和千里之外的供电厂就能“通信”了,把你的电脑想成是客户端,把千里之外的供电厂想成是服务器,通过插座和很长很长的线缆你们就可以勾搭上了,那么Socket在这其中相当于什么呢?“插座!”没错,就是插座!对于我的电脑来说,我想让它通电工作,我只需要个插座就行了啊,什么插座是什么材质的,线缆是什么型号的,供电厂到底在什么经纬度,电力到底怎么传输,我管它干嘛呢,都跟我没关系!我只要知道我需要的不是整个世界,而是。。。

一个插座!读到这里,想必同学已经对“插座”有了很森的理解了;再举一个例子,你和基友的电脑通过有线的方式连上了同一个路由器,这个时候你们就可以直接通过内网IP地址进行访问了,在这个过程中,那个方方的接口(RJ45接口)就是“Socket”,反正插上“Socket”就能用,我不用管到底通过Socket怎么能够实现通信。在计算机编程的网络世界里,作为应用程序,我只需要一个“插座”就可以和任何服务器通信了,想想都有点小激动呢~~~

接下来要讲的就是,电脑电源需要一个socket去插上,那么发电厂呢,也同样需要一个插座插上去来给你供电——也就是说,发电厂需要一个“插座”!。。。废话,,,,没错,确实是这样,服务器端也需要一个“插座”,只不过它叫做ServerSocket(这看起来像是继承自Socket,我也不知道,待查)。

有了“插座”(Socket)的概念之后,我们就可以愉快地让电脑(客户端)与发电厂(服务器)通信了。无论是客户端还是服务器,都需要Socket,鉴于咱们今天的题目是“搭建web服务器”,所以咱们接下来就来看一下怎么创建服务器的ServerSocket。说道这里,有同学就会问到了,“难道客户端不需要Socket吗?”,确实需要,因为我们是用浏览器访问本机IP“127.0.0.1”,所以客户端的Socket就由浏览器自己维护了,不需要咱们动手写的。“可是我还是不明白为什么在浏览器里输入127.0.0.1之后就可以看到我的网页了?求解释” 好,那咱们慢慢来,先动手编写一个服务器端的ServerSocket吧啦啦啦~

创建服务器端Socket的步骤如下:

1、创建ServerSocket对象

ServerSocket serverSocket = new ServerSocket(“80”); //这里只需要指明当前程序监听80号端口就可以了,至于为什么是80,因为我喜欢!“好霸道。。。”因为我们要监听web请求,默认就是80号端口。其实,1-1024端口被操作系统占用了,1025-65535的端口你随便用,只要不会和其他应用程序冲突就可以(别用什么类似3389这么常用的端口就好了。。。)

2、作为服务器,我要知道,我的使命就是要等待客户端发来请求,也就是客户端发来Socket,我首先要把它Hold住!

Socket socket = serverSocket.accept(); //这里需要特别说明一下,accept方法比较特殊,它是一个阻塞方法(block method),因为只要它等不来客户端发来的请求(Socket),它就一直等下去而不会继续执行它下面的代码。唉,此等痴情人怎么跟我一样O(∩_∩)O

3、客户端要向我表白,给我发来情书,那我作为服务器只要得到它的输入就好了

InputStream inputStream = socket.getInputStream(); //注意,客户端发来的表白信息都在socket里面,而不是serverSocket里面,这点要是弄错了,读不到情书内容,活该你单身。(我只有冷笑。。。)

4、收到了情书,我好想知道里面究竟写了什么啊!迫!不!及!待! 好,开始解析情书内容

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));  

//java包装类,只为读到写给我的情书,耶~  

String line = “”;  

while ( (line = reader.readLine()) != null ){  

 System.out.println(line);  

}  

5、组装前4步的代码,会要求try catch一下异常,正常捕获就好 下面贴代码

public class MultiWebServer {  

public static void main(String[] args) {  

 try {  

 ServerSocket serverSocket = new ServerSocket(80);  

 System.out.println("正在等待情书中...");  

 Socket socket = serverSocket.accept();  

 System.out.println("收到情书,我要开始解析!");  

 InputStream inputStream = socket.getInputStream();  

 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));  

 String line = "";  

 while ( (line = reader.readLine()) != null ){  

 System.out.println(line);  

 }  

 } catch (Exception e) {  

 e.printStackTrace();  

 }  

 }  

}  

(编辑:济南站长网)

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

热点阅读