当前位置:首页 » 操作系统 » lighthttpd源码

lighthttpd源码

发布时间: 2023-12-23 06:26:42

㈠ apache 解析一个错误的php文件时,会直接显示php的源码,如何让他不显示源码。

1、在可能出异常的代码后面 die('....自己写错误信息');
2、在php中代码前加error_reporting(0);
3、修改php.ini 中 display_errors设置为display_errors = off

㈡ 如何开发自己的HttpServer-NanoHttpd源码解读

现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了。用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后都发生了什么技术细节还真不是很简单的。所以新的系列将是分享我学习Http Server的过程。


NanoHttpd是Github上的一个开源项目,号称只用一个java文件就能创建一个http server,我将通过分析NanoHttpd的源码解析如何开发自己的HttpServer。Github 地址:https://github.com/NanoHttpd/nanohttpd


在开始前首先简单说明HttpServer的基本要素:

1.能接受HttpRequest并返回HttpResponse

2.满足一个Server的基本特征,能够长时间运行


关于Http协议一般HttpServer都会声明支持Http协议的哪些特性,nanohttpd作为一个轻量级的httpserver只实现了最简单、最常用的功能,不过我们依然可以从中学习很多。


首先看下NanoHttpd类的start函数


[java]view plain

publicvoidstart()throwsIOException{

myServerSocket=newServerSocket();

myServerSocket.bind((hostname!=null)?newInetSocketAddress(hostname,myPort):newInetSocketAddress(myPort));

myThread=newThread(newRunnable(){

@Override

publicvoidrun(){

do{

try{

finalSocketfinalAccept=myServerSocket.accept();

registerConnection(finalAccept);

finalAccept.setSoTimeout(SOCKET_READ_TIMEOUT);

finalInputStreaminputStream=finalAccept.getInputStream();

asyncRunner.exec(newRunnable(){

@Override

publicvoidrun(){

OutputStreamoutputStream=null;

try{

outputStream=finalAccept.getOutputStream();

=tempFileManagerFactory.create();

HTTPSessionsession=newHTTPSession(tempFileManager,inputStream,outputStream,finalAccept.getInetAddress());

while(!finalAccept.isClosed()){

session.execute();

}

}catch(Exceptione){

//,wethrowourownSocketException

//tobreakthe"keepalive"loopabove.

if(!(einstanceofSocketException&&"NanoHttpdShutdown".equals(e.getMessage()))){

e.printStackTrace();

}

}finally{

safeClose(outputStream);

safeClose(inputStream);

safeClose(finalAccept);

unRegisterConnection(finalAccept);

}

}

});

}catch(IOExceptione){

}

}while(!myServerSocket.isClosed());

}

});

myThread.setDaemon(true);

myThread.setName("NanoHttpdMainListener");

myThread.start();

}

1.创建ServerSocket,bind制定端口


2.创建主线程,主线程负责和client建立连接

3.建立连接后会生成一个runnable对象放入asyncRunner中,asyncRunner.exec会创建一个线程来处理新生成的连接。

4.新线程首先创建了一个HttpSession,然后while(true)的执行httpSession.exec。

这里介绍下HttpSession的概念,HttpSession是java里Session概念的实现,简单来说一个Session就是一次httpClient->httpServer的连接,当连接close后session就结束了,如果没结束则session会一直存在。这点从这里的代码也能看到:如果socket不close或者exec没有抛出异常(异常有可能是client段断开连接)session会一直执行exec方法。

一个HttpSession中存储了一次网络连接中server应该保存的信息,比如:URI,METHOD,PARAMS,HEADERS,COOKIES等。

5.这里accept一个client的socket就创建一个独立线程的server模型是ThreadServer模型,特点是一个connection就会创建一个thread,是比较简单、常见的socket server实现。缺点是在同时处理大量连接时线程切换需要消耗大量的资源,如果有兴趣可以了解更加高效的NIO实现方式。

当获得client的socket后自然要开始处理client发送的httprequest。


Http Request Header的parse:


[plain]view plain

//Readthefirst8192bytes.

//Thefullheadershouldfitinhere.

//Apache'sdefaultheaderlimitis8KB.

//!

byte[]buf=newbyte[BUFSIZE];

splitbyte=0;

rlen=0;

{

intread=-1;

try{

read=inputStream.read(buf,0,BUFSIZE);

}catch(Exceptione){

safeClose(inputStream);

safeClose(outputStream);

thrownewSocketException("NanoHttpdShutdown");

}

if(read==-1){

//socketwasbeenclosed

safeClose(inputStream);

safeClose(outputStream);

thrownewSocketException("NanoHttpdShutdown");

}

while(read>0){

rlen+=read;

splitbyte=findHeaderEnd(buf,rlen);

if(splitbyte>0)

break;

read=inputStream.read(buf,rlen,BUFSIZE-rlen);

}

}

1.读取socket数据流的前8192个字节,因为http协议中头部最长为8192


2.通过findHeaderEnd函数找到header数据的截止位置,并把位置保存到splitbyte内。


[java]view plain

if(splitbyte<rlen){

inputStream.unread(buf,splitbyte,rlen-splitbyte);

}

parms=newHashMap<String,String>();

if(null==headers){

headers=newHashMap<String,String>();

}

//.

BufferedReaderhin=newBufferedReader(newInputStreamReader(newByteArrayInputStream(buf,0,rlen)));

//

Map<String,String>pre=newHashMap<String,String>();

decodeHeader(hin,pre,parms,headers);


1.使用unread函数将之前读出来的body pushback回去,这里使用了pushbackstream,用法比较巧妙,因为一旦读到了header的尾部就需要进入下面的逻辑来判断是否需要再读下去了,而不应该一直读,读到没有数据为止

2.decodeHeader,将byte的header转换为java对象


1.Http协议第一行是Method URI HTTP_VERSION


2.后面每行都是KEY:VALUE格式的header

3.uri需要经过URIDecode处理后才能使用

4.uri中如果包含?则表示有param,httprequest的param一般表现为:/index.jsp?username=xiaoming&id=2


下面是处理cookie,不过这里cookie的实现较为简单,所以跳过。之后是serve方法,serve方法提供了用户自己实现httpserver具体逻辑的很好接口。在NanoHttpd中的serve方法实现了一个默认的简单处理功能。

这个默认的方法处理了PUT和POST方法,如果不是就返回默认的返回值。


parseBody方法中使用了tmpFile的方法保存httpRequest的content信息,然后处理,具体逻辑就不细说了,不是一个典型的实现。


最后看一下发response的逻辑:


sendAsFixedLength(outputStream,pending);

}

outputStream.flush();

safeClose(data);

}catch(IOExceptionioe){

//Couldn'twrite?Nocando.

}

}

发送response的步骤如下:


1.设置mimeType和Time等内容。

2.创建一个PrintWriter,按照HTTP协议依次开始写入内容

3.第一行是HTTP的返回码

4.然后是content-Type

5.然后是Date时间

6.之后是其他的HTTP Header

7.设置Keep-Alive的Header,Keep-Alive是Http1.1的新特性,作用是让客户端和服务器端之间保持一个长链接。

8.如果客户端指定了ChunkedEncoding则分块发送response,Chunked Encoding是Http1.1的又一新特性。一般在response的body比较大的时候使用,server端会首先发送response的HEADER,然后分块发送response的body,每个分块都由chunk length 和chunk data 组成,最后由一个0 结束。


9.如果没指定ChunkedEncoding则需要指定Content-Length来让客户端指定response的body的size,然后再一直写body直到写完为止。




最后总结下实现HttpServer最重要的几个部分:

1.能够accept tcp连接并从socket中读取request数据

2.把request的比特流转换成request对象中的对象数据

3.根据http协议的规范处理http request

4.产生http response再写回到socket中传给client。

㈢ 有没有弘历软件中的蓝色幽灵指标源码

点击(此处)折叠或打开
cat >> /etc/init.d/nginx <<EOF
#! /bin/sh
ulimit -n 65535
# Description: Startup script for nginx
# chkconfig: 2345 55 25
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/nginx.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
kill -QUIT `cat $PIDFILE` || echo -n "nginx not running"
}
do_reload() {
kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
/etc/init.d/httpd start
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
/etc/init.d/httpd stop
;;
reload)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
/etc/init.d/httpd restart
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
sleep 1
do_start
echo "."
/etc/init.d/httpd restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0
EOF

㈣ 源码安装apache报错如下,求助

如下:
ab.o: In function `main':
/APP/software/httpd-2.4.4/support/ab.c:2273: undefined reference to `TLSv1_2_client_method'
/APP/software/httpd-2.4.4/support/ab.c:2271: undefined reference to `TLSv1_1_client_method'
collect2: ld returned 1 exit status
make[2]: *** [ab] Error 1
make[2]: Leaving directory `/APP/software/httpd-2.4.4/support'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/APP/software/httpd-2.4.4/support'
make: *** [all-recursive] Error 1

㈤ Apache+PHP,源代码直接输出

1 检查一下你是否安装了PHP模块,我以前用的时候Apache不包含PHP的,得另外找,然后安装上。
2 看一下Apache的日志,是否模块没有正常加载。

phpinfo()函数是能看到PHP的信息,说明PHP可以正常工作了啊,看看你写的文件是不是不对了。

㈥ 搞了一个php网站的源码,为什么里面都是把php代码写在.html文件中该如何运行

服务器配置问题,如果是apache 服务器,请打开配置文件,找到
AddType application/x-httpd-php .php
将其改为
AddType application/x-httpd-php .html

这个语句就是指定扩展名的,可以改成任何格式,只要你的php文件以这个扩展名命名

都说咯,是配置的问题啊,人家只是把php 扩展名 改成咯 html而已,需要在服务器端将php的文件解析配置成 解析html就行咯,

linux apache不能解析php文件,访问后出现的是源代码,什么原因啊

没有加载PHP模块或者是MIME类型没填对,PHP文件被当成了纯文本文件提供下载而不执行里面的代码。Apache本身是不具备执行PHP代码的能力的,需要把PHP当成Apache的一个模块来加载来解析PHP文件。你看看apache的配置文件httpd.conf是否有类似的内容,C:/php-5.3.5 是我电脑上的PHP安装目录,你要改成自己电脑的路径

#添加PHP模块
LoadMole php5_mole C:/php-5.3.5/php5apache2_2.dll

#指定PHP程序的根目录
PHPIniDir "C:/php-5.3.5"

#添加MIME映射,让apache把PHP文件当成代码文件来执行
AddType application/x-httpd-php .php .phtml

感觉LZ是初学者,不会配置PHP运行环境的话,建议你搜一下XAMPP,这个是Linux下的PHP傻瓜包,直接把Apache, PHP,MYSQL 等全部自动部署好了。

热点内容
wow刷碎片脚本 发布:2024-11-29 15:58:24 浏览:590
明小子源码 发布:2024-11-29 15:15:30 浏览:143
苹果8plus什么配置 发布:2024-11-29 14:16:36 浏览:677
androidmvp结构 发布:2024-11-29 14:16:34 浏览:536
androidsqlite命令 发布:2024-11-29 14:04:38 浏览:156
信用卡分期算法 发布:2024-11-29 13:50:56 浏览:808
安卓手机dll文件为什么打不开 发布:2024-11-29 13:40:49 浏览:1003
百分之五十石碳酸怎么配置 发布:2024-11-29 13:38:56 浏览:974
我的世界服务器如何装资源包 发布:2024-11-29 13:25:48 浏览:22
mc服务器的ip是什么 发布:2024-11-29 13:23:33 浏览:570