本系列教程将和您一起探讨如何利用Java语言一步一步实现自己的web服务器。
1需求描述
第1讲我们要实现的效果是:当我们在浏览器的地址栏输入localhost:8080的时候,我们会看到"hello,this is my web server!"。如下:
2实现
做任何事情都不能太急,对于编程来说也不例外。以上的案例虽然简单,但却是我们编写web服务器的非常关键的一步,麻雀虽小,五脏俱全。
2.1基础知识
首先我们来分析一下,为了实现上面的功能,我们需要具备哪些基础知识。
1)CS架构介绍
CS架构是一种非常常见的软件架构,主要由两部分组成:客户端和服务器端即C端和S端。
图2-1 CS架构
其一般的交互流程为:客户端发送一条请求给服务器,服务器在收到请求后,解析处理该请求,并将结果以响应的方式返回给客户端。
那么在我们要要实现的需求中,客户端特定为浏览器,请求特指http请求,响应特指http响应。
一般情况CS架构的软件,我们需要分别开发C端和S端的程序,但是由于本题客户端就是我们日常使用的浏览器,所以我们不需要开发C端程序,所以仅需要开发服务器端程序。
这是我们实现需求需要了解的第一个基础知识。
2)http请求和响应
有了上面的基础知识后,接下来我们需要具体的了解,这个http请求长什么样,http响应长什么样?
下面我们来看一个具体的请求和响应报文的格式:
http请求报文:
GET / HTTP/1.1Host: www.baidu.com.cnConnection: keep-alivePragma: no-cacheCache-Control: no-cacheUpgrade-Insecure-Requests:1User-Agent: Mozilla/5.0(MacintoshIntel Mac OS X 10_12_3) AppleWebKit/537.36(KHTML, like Gecko)Chrome/56.0.2924.87 Safari/537.36Accept:text/html,application/xhtml+xml,application/xmlq=0.9,image/webp,*/*q=0.8Accept-Encoding: gzip, deflate,sdchAccept-Language:zh-CN,zhq=0.8,enq=0.6,zh-TWq=0.4,jaq=0.2
http响应报文:
HTTP/1.1200 OKCache-Control: privateContent-Length:21005Content-Type: text/htmlServer: Microsoft-IIS/7.0X-Powered-By: ASP.NETDate: Tue,07 Mar 201701:59:58GMT
如想了解更多,算法与编程之美公众号的《BS架构基础-http报文》有简单易懂的介绍。
3)Socket编程
有了以上的基础知识之后,我们还需要了解Java在实现CS架构时使用的具体技术,那就是socket编程。socket编程的入门其实并不难,下面为大家做简要介绍:
- socket编程可以分为两部分,一部分为服务器端的编程,另外一部分为客户端。对于服务器端我们使用ServerSocket类,客户端使用Socket类。
-一旦建立连接后,获取了客户端的socket对象,接下来就可以通过socket对象的InputStream来读取请求,而OutputStream来写响应。
只需要了解上面的两点即可,如想了解更多,算法与编程之美公众号的《Socket编程基础》有简单易懂的介绍。
2.2实现
有了上面的3个基础知识点后,接下来我们可以开始编程实现了。
主要的业务流程为:
1.服务器端利用ServerSocket开启8080端口开始监听;
2.当有客户端发起的http请求时,接受该客户端读取http请求,进行相关处理;
3.返回http响应。
具体的代码实现如下:
public class WebServer {private ServerSocket serverSocketpublic WebServer(){ try {//开启8080端口监听 serverSocket = newServerSocket(8080)} catch (IOException e){ e.printStackTrace()}}public void run(){ try { Socket socket =serverSocket.accept()//读取http请求 BufferedReader reader = newBufferedReader(new InputStreamReader(socket.getInputStream()))String line = nullwhile (!(line =reader.readLine()).equals("")){ System.out.println(line)} //返回http响应 PrintWriter writer = newPrintWriter(socket.getOutputStream())writer.print("HTTP/1.1200OK\\r\\n")writer.print("\\r\\n")writer.print("hello, thisis my web server!")writer.flush()socket.close()} catch (IOException e){ e.printStackTrace()} }public static void main(String[] args){ new WebServer().run()}}
3总结
我们已经按照需求实现了相关功能,但是细心的你可能会发现以下的问题:
1)浏览器刷新一次,服务器端程序就终止了;
2)这个服务器能不能作为静态网页html服务器呢?
3)。。。
如想了解更多,欢迎关注“算法与编程之美”公众号将持续为您带来更多精彩内容。
注意:安装的前提条件是配置好Git的相关环境或者安装好git.exe,此处不再重点提及上传的步骤:(本文采用git 命令界面进行操作)
( git config --global user.email "you@example.com"
git config --global user.name "Your Name")实现登陆
1.进入本地的项目目录,右键“Git Bash here”,调出git命令行界面,然后输入
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
git init
2.就是将目录下的所有文件上传,也可以将“.”换成具体的文件名
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
git add .
3.将项目提交到gitHub
[html] view plain copy 在CODE上查看代码片派生到我的代码片
git commit -m "注释语句"
4.在github上创建新的repository
5.点击 “Create repository”跳转到一个连接,如下红色圈获取到本项目的github地址
6.将本地的代码关联到github上
[html] view plain copy 在CODE上查看代码片派生到我的代码片
git remote add origin 项目的github地址
7.上传代码到github之前需要先pull
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
git pull origin master
8.上传代码到远程仓库
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
git push -u origin master
之后输入账号,密码,上传到github
从图上可以看到,PHP实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令 (opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也都是C的函数,实际上,我们可以把PHP看 做是一个C开发的软件。
PHP的执行的核心是翻译出来的一条一条指令,也即opcode。
Opcode是PHP程序执行的最基本单位。一个opcode由两个参数(op1,op2)、返回值和处理函数组成。PHP程序最终被翻译为一组opcode处理函数的顺序执行。
常见的几个处理函数:
1 ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 变量分配 ($a=$b)
2 ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函数调用
3 ZEND_CONCAT_SPEC_CV_CV_HANDLER:字符串拼接 $a.$b
4 ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法运算 $a+2
5 ZEND_IS_EQUAL_SPEC_CV_CONST:判断相等 $a==1
6 ZEND_IS_IDENTICAL_SPEC_CV_CONST:判断相等 $a===1
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)