简单http服务器代码
- 格式:docx
- 大小:19.65 KB
- 文档页数:6
【转】python-mSimpleHTTPServer简单服务器命令如果你急需⼀个简单的Web Server,但你⼜不想去下载并安装那些复杂的HTTP服务程序,⽐如:Apache,ISS等。
那么,可能帮助你。
使⽤Python可以完成⼀个简单的内建 HTTP 服务器。
于是,你可以把你的⽬录和⽂件都以HTTP的⽅式展⽰出来。
佻只需要⼲⼀件事情,那就是安装⼀个Python。
实际上来说,这是⼀个可以⽤来共享⽂件的⾮常有⽤的⽅式。
实现⼀个微型的HTTP服务程序来说是很简单的事情,在Python下,只需要⼀个命令⾏。
下⾯是这个命令⾏:(假设我们需要共享我们的⽬录/home/haoel⽽IP地址是192.168.1.1)1 2$ cd/home/haoel$ python -m SimpleHTTPServer这就⾏了,⽽我们的HTTP服务在8000号端⼝上侦听。
你会得到下⾯的信息:Serving HTTP on 0.0.0.0 port 8000 ...你可以打开你的浏览器(IE或Firefox),然后输⼊下⾯的URL:http://192.168.1.1:8000如果你的⽬录下有⼀个叫 index.html 的⽂件名的⽂件,那么这个⽂件就会成为⼀个默认页,如果没有这个⽂件,那么,⽬录列表就会显⽰出来。
如果你想改变端⼝号,你可以使⽤如下的命令:1$ python -m SimpleHTTPServer 8080如果你只想让这个HTTP服务器服务于本地环境,那么,你需要定制⼀下你的Python的程序,下⾯是⼀个⽰例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19import sysimport BaseHTTPServerfrom SimpleHTTPServer import SimpleHTTPRequestHandler HandlerClass =SimpleHTTPRequestHandler ServerClass =BaseHTTPServer.HTTPServerProtocol ="HTTP/1.0"if sys.argv[1:]:port =int(sys.argv[1])else:port =8000server_address =('127.0.0.1', port)HandlerClass.protocol_version =Protocolhttpd =ServerClass(server_address, HandlerClass)sa =httpd.socket.getsockname()print"Serving HTTP on", sa[0], "port", sa[1], "..."httpd.serve_forever()注意:所有的这些东西都可以在 Windows 或下⼯作。
WinHttp编写HTTP服务器⽰例代码这是微软提供的⽰例程序,原⽂地址在此HTTP Server⽰例程序以下⽰例应⽤程序展⽰如何使⽤HTTP Server API处理HTTP请求任务。
第⼀个⽰例中包含的precomp.h⽂件包含⽰例所需的所有头⽂件,如下:#ifndef UNICODE#define UNICODE#endif#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0600#endif#ifndef WIN32_LEAN_AND_MEAN#define WIN32_LEAN_AND_MEAN#endif#include <windows.h>#include <http.h>#include <stdio.h>#pragma comment(lib, "httpapi.lib")Main and Preliminaries(main和准备⼯作)#include "precomp.h"//// Macros.初始化HTTP响应体宏//#define INITIALIZE_HTTP_RESPONSE( resp, status, reason ) \do \{ \RtlZeroMemory( (resp), sizeof(*(resp)) ); \(resp)->StatusCode = (status); \(resp)->pReason = (reason); \(resp)->ReasonLength = (USHORT) strlen(reason); \} while (FALSE)#define ADD_KNOWN_HEADER(Response, HeaderId, RawValue) \do \{ \(Response).Headers.KnownHeaders[(HeaderId)].pRawValue = \(RawValue);\(Response).Headers.KnownHeaders[(HeaderId)].RawValueLength = \(USHORT) strlen(RawValue); \} while(FALSE)#define ALLOC_MEM(cb) HeapAlloc(GetProcessHeap(), 0, (cb))#define FREE_MEM(ptr) HeapFree(GetProcessHeap(), 0, (ptr))//// Prototypes.原型//DWORD DoReceiveRequests(HANDLE hReqQueue);DWORDSendHttpResponse(IN HANDLE hReqQueue,IN PHTTP_REQUEST pRequest,IN USHORT StatusCode,IN PSTR pReason,IN PSTR pEntity);DWORDSendHttpPostResponse(IN HANDLE hReqQueue,IN PHTTP_REQUEST pRequest);/*******************************************************************++函数说明:参数:argc - 命令⾏参数个数.argv - 命令⾏参数.返回值:Success/Failure--*******************************************************************/int __cdecl wmain(int argc,wchar_t * argv[]){ULONG retCode;HANDLE hReqQueue = NULL;int UrlAdded = 0;HTTPAPI_VERSION HttpApiVersion = HTTPAPI_VERSION_1;if (argc < 2){wprintf(L"%ws: <Url1> [Url2] ... \n", argv[0]);return -1;}初始化HTTP Service//// 初始化HTTP Server APIs//retCode = HttpInitialize(HttpApiVersion,HTTP_INITIALIZE_SERVER, // FlagsNULL // Reserved);if (retCode != NO_ERROR){wprintf(L"HttpInitialize failed with %lu \n", retCode);return retCode;}//// 创建请求队列句柄//retCode = HttpCreateHttpHandle(&hReqQueue, // Req Queue0 // Reserved);if (retCode != NO_ERROR){wprintf(L"HttpCreateHttpHandle failed with %lu \n", retCode);goto CleanUp;}注册URLs进⾏监听//// 命令⾏参数指定要监听的URI。
如何在Python中进行服务器部署服务器部署是指将你的应用程序或网站发布到一个可供访问的服务器上。
Python作为一种强大的编程语言,提供了多种方式来进行服务器部署。
本文将介绍三种常用的Python服务器部署方法:使用HTTP 服务器模块、使用Flask框架以及使用Django框架。
一、使用HTTP服务器模块进行服务器部署Python的标准库自带了几个HTTP服务器模块,如`http.server`和`socketserver`。
这些模块使得你可以在本地快速搭建一个简单的HTTP 服务器。
下面是一个使用`http.server`模块搭建HTTP服务器的示例代码:```pythonimport http.serverimport socketserverPORT = 8000Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print("Serving at port", PORT)httpd.serve_forever()```以上代码会在本地开启一个HTTP服务器,监听8000端口。
你可以将你的应用程序或网站文件放在当前目录下,然后通过浏览器访问`http://localhost:8000`来查看。
二、使用Flask框架进行服务器部署Flask是一个轻量级的Python web框架,可以用于构建各种规模的网站和Web应用程序。
首先,你需要安装Flask模块。
可以使用以下命令来安装:```pip install flask```下面是一个使用Flask框架进行服务器部署的示例代码:```pythonfrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello():return "Hello World!"if __name__ == '__main__':app.run()```以上代码定义了一个简单的Flask应用,当访问根URL时,返回"Hello World!"。
Linux下HttpServer简要设计说明及源代码Linux下Http Server设计说明一、功能说明1、本程序实现简易httpServer,支持简单的文件请求以及cgi调用。
2、提供200(OK),403(Forbidden),404(Not Found),501(Not Implemented)几种类型消息响应。
3、支持多用户并发访问。
4、关于php解释器:支持的功能:1)、允许php脚本与html脚本嵌套2)、支持简单的echo,if,elseif,else,for,while以及相互之间的嵌套3)、支持后缀自增运算符($i++),赋值操作,包括字符串拼接,数值运算,数与字符串拼接不支持的功能:1)、不支持echo后面跟多行作为输出2)、暂时不支持语句内的注释3)、与运算有关的暂时只支持+,-操作,不支持%,*,/;不支持类似$i+=2的操作4)、暂时不支持数组操作要求与限制:1)、必须有作为结尾2)、放在if,else,for,while中的语句无论有多少条都必须用花括号括起来3)、暂时假定php文件的内容可以一次全部读入缓冲区二、相关知识http协议分为请求消息和响应消息,请求消息由三部分构成,请求行、消息报头、请求正文。
请求行格式为:Method Request-URI HTTP-Version CRLF消息报头由一系列的key-value对组成,每行一个,格式为key+”:”+空格+value,消息报头与消息正文间有一单独空行。
响应消息类似,其中有一个状态码表示服务器处理的结果,常见有200(OK)表示请求已被成功接收、理解、接受;403(Forbidden)表示由于权限问题等服务器拒绝提供服务;404(Not Found)表示请求的资源不存在等;501(Not Implemented)则表示服务器端未实现相应的功能。
三、设计步骤1、创建一个服务器,并监听既定的端口等待客户端的连接。
python⽹络编程—HTTP客户端A simple http client.It gets the contents of special webserver page and print it.(Default path is "/")#!/usr/share/env python#coding:utf-8import argparseimport httplib#设置默认访问url和端⼝REMOTE_SERVER_HOST=''REMOTE_SERVER_PATH='/'class HTTPClient(object):"""docstring for HTTPClientEg: python HTTPClient.py --host= python HTTPClient.py --host= --path='/domains/reserved'"""def __init__(self, host):self.host = hostdef fetch(self,path):http = httplib.HTTP(self.host)#设置请求头信息http.putrequest("GET",path)http.putheader("User-Agent",__file__)http.putheader("Host",self.host)http.putheader("Accept","*/*")http.endheaders()try:#getreply⽅法返回service code ,service reseason,RFC82 headerserrcode,errmsg,headers = http.getreply()except Exception,e:print "Client failed code: %s message: %s headers: %s" %(errcode,errmsg,headers)else:print "Got homepage from %s" %self.host#打印获取的内容file = http.getfile()return file.read()if __name__ == '__main__':parse = argparse.ArgumentParser(description='HTTP Client Example')parse.add_argument('--host',action="store",dest="host",default=REMOTE_SERVER_HOST)parse.add_argument('--path',action="store",dest="path",default=REMOTE_SERVER_PATH)given_args = parse.parse_args()host,path = given_args.host,given_args.pathclient = HTTPClient(host)print client.fetch(path)。
不知道大家上网是是否碰到过打开网页后报303,403等错误,让侯IE会给出一大堆的提示告诉你如何处理这些事,但是最后还是不能打开网页,有的人都认为是自己网络问题,其实不然,有时候网页的服务器负载也会出现这类的现象,所以大家就要好好了解下,到底代码所代表的意思了,HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。
它由RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。
代码说明100 (继续)请求者应当继续提出请求。
服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。
2xx (成功)表示成功处理了请求的状态代码。
代码说明200 (成功)服务器已成功处理了请求。
通常,这表示服务器提供了请求的网页。
201 (已创建)请求成功并且服务器创建了新的资源。
202 (已接受)服务器已接受请求,但尚未处理。
203 (非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容)服务器成功处理了请求,但没有返回任何内容。
205 (重置内容)服务器成功处理了请求,但没有返回任何内容。
206 (部分内容)服务器成功处理了部分GET 请求。
3xx (重定向)表示要完成请求,需要进一步操作。
通常,这些状态代码用来重定向。
代码说明300 (多种选择)针对请求,服务器可执行多种操作。
服务器可根据请求者(user agen t) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动)请求的网页已永久移动到新位置。
服务器返回此响应(对GET 或H EAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
JAVA代码实现HTTP请求的常用方法在Java中,有多种方法可以实现HTTP请求。
下面将介绍几种常用的方法。
1. 使用Java内置的URL类和HttpURLConnection类:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class HTTPRequestExamplepublic static void main(String[] args) throws ExceptionURL obj = new URL(url);HttpURLConnection con = (HttpURLConnection)obj.openConnection(;//设置请求方法con.setRequestMethod("GET");//添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");//获取响应码int responseCode = con.getResponseCode(;System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream());String inputLine;StringBuffer response = new StringBuffer(;while ((inputLine = in.readLine() != null)response.append(inputLine);}in.close(;//打印响应内容System.out.println(response.toString();}```2. 使用第三方库HttpClient:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception //创建GET请求//发送请求并获取响应//解析响应实体内容//打印响应内容System.out.println(response);// 关闭HttpClient连接}```3. 使用第三方库OkHttp:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient(;// 创建Request对象Request request = new Request.Builder.url(url).build(;//发送请求并获取响应Response response = okHttpClient.newCall(request).execute(;String responseBody = response.body(.string(;//打印响应内容System.out.println(responseBody);}```4. 使用第三方库RestTemplate(Spring框架的一部分):```javaimport org.springframework.web.client.RestTemplate;public class HTTPRequestExamplepublic static void main(String[] args)// 创建RestTemplate对象RestTemplate restTemplate = new RestTemplate(;//发送GET请求,并获取响应ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);//获取响应内容String response = responseEntity.getBody(;//打印响应内容System.out.println(response);}```这些方法提供了不同的方式来实现HTTP请求,使用Java内置的URL 类和HttpURLConnection类相对简单,但是需要自己处理底层连接和数据读取。
/*基于流式套接字C/S结构的服务器端。
通信规程:1、客户端连接到服务器以后,向服务器端发送命令2、服务器解析命令的正确性,对于错误的命令,向客户端发送"Bad Command"的响应信息。
3、客户端主动断开连接,通过发送Quit命令实现。
4、服务器端在服务过程中,检测到错误后断开连接。
说明:1、服务器工作在单线程select模型,所有处理都在main()中进行。
2、在该模式下,服务器并发为多个客户端提供服务3、和基于非阻塞模式的单线程并发服务程序的区别是:不要求套接字工作在非阻塞模式。
*///添加必要的头文件//#define FD_SETSIZE 20#include <winsock2.h>#include <stdio.h>#define MAX_CLIENT_COUNT FD_SETSIZE-1//用这种方式添加链接库信息#pragma comment(lib,"ws2_32")//服务器默认工作在7777端口,所有IP地址接收的连接请求都处理#define DEFAULTPORT 7777//接收、发送缓冲区大小#define SIZE_INBUF 1024#define SIZE_OUTBUF 1024#define HTTP_SERVER_OUTPUT_HEAD "HTTP/1.1 200 OK\r\n" "Date: Wed,22nov 2000 02:44:34 GMT\r\n" "Server: Windows\r\n" "Last-Modified: Tue, 18 Apr 2000 13:24:10 GM T\r\n" "Accept-Ranges: bytes\r\n" "Content-Length: 121\r\n" "Connection: close\r\n" "Content-Type: text/html; charset=US-ASCII\r\n\r\n"#define METHOD_NOT_IMPLEMENTED"<html><head><title>test</title></head><body><h1><div align=center><p>Hello Word!</p></h1></body></html>\r\n\r\n"int main(void){//1 准备WinSock执行环境WORD ver=MAKEWORD(2,2);WSADATA wsdata;intretCode;retCode=WSAStartup(ver,&wsdata);if(retCode){printf("==========WinSock初始化失败!程序退出==========\n");return -1;}printf("==========WinSock初始化成功!==========\n");//2 创建套接字SOCKET sockListen=INVALID_SOCKET;sockListen=socket(AF_INET,SOCK_STREAM,0);if(INVALID_SOCKET==sockListen){printf("==========监听套接字创建失败!==========\n");WSACleanup();return -2;}printf("==========监听套接字[%d]创建成功!==========\n",sockListen);//3 准备监听信息sockaddr_inaddrServer;//将地址信息结构体的所有字节均用0填充。
填充时需要指定起始地址、填充内容和填充字节数memset((void*)&addrServer,0,sizeof(sockaddr_in));addrServer.sin_family=AF_INET;addrServer.sin_port=htons(DEFAULTPORT);addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//4 将监听套接字绑定到特定地址(服务器端独有)printf("监听套接字绑定到[%s:%d]......\n",inet_ntoa(addrServer.sin_addr),DEFAULTPORT);retCode=bind(sockListen,(sockaddr*)&addrServer,sizeof(addrServer));if(SOCKET_ERROR==retCode){printf("绑定失败,错误代码:%d\n",WSAGetLastError());closesocket(sockListen);WSACleanup();return -3;}printf("绑定成功\n");boolkeepListening=true;boolkeepWorking=true;int i;//定义保存套接字的数组SOCKET Socks[MAX_CLIENT_COUNT];for(i=0;i<MAX_CLIENT_COUNT;i++){Socks[i]=INVALID_SOCKET;}//定义关注可读性网络事件的集合fd_setfdread;//5 进入监听状态retCode=listen(sockListen,5);if(SOCKET_ERROR==retCode){printf("监听套接字不能正确进入监听状态,错误代码:%d\n",WSAGetLastError());closesocket(sockListen);WSACleanup();return -4;}printf("成功进入监听状态......\n");//7 应用层通信规程//对于服务器端,一般是经常运行SOCKET sockResponse=INVALID_SOCKET;sockaddr_inaddrClient;intaddrSize=sizeof(addrClient);intrecvBytes=0;charInBuf[SIZE_INBUF];charOutBuf[SIZE_OUTBUF];//保存客户端地址信息的字符数组,格式为IP地址:端口号charClientInfo[20];// char m_requestheader[1024];//主循环//超时间隔timevaltv;_sec=1;_usec=0;while(keepListening){//1.清空关心的套接字集合fd_setFD_ZERO(&fdread);//2.将感兴趣的套接字加入到相应集合FD_SET(sockListen,&fdread);for(i=0;i<MAX_CLIENT_COUNT;i++){if(INVALID_SOCKET!=Socks[i])FD_SET(Socks[i],&fdread);}//3.调用selectretCode=select(0,&fdread,NULL,NULL,NULL);//&tv);//4.根据返回值进行处理if(retCode==0){printf("select函数结束:超时\n");continue;}if(retCode==SOCKET_ERROR){printf("select函数结束:错误,代码%d\n",WSAGetLastError());continue;}//4.1监听套接字if(FD_ISSET(sockListen,&fdread)){memset(&addrClient,0,sizeof(addrClient));//调用accept函数接收客户端连接请求。
sockResponse=accept(sockListen,(sockaddr*)&addrClient,&addrSize);if(INVALID_SOCKET==sockResponse){printf("接收连接请求的过程中产生错误,代码:%d\n",WSAGetLastError());}else{sprintf(ClientInfo,"%s:%d",inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port));printf("接受来自[%s]的客户端连接请求,建立连接,响应套接字ID是[%d]\n",ClientInfo,sockResponse);//查找一个可用的套接字数组元素for(i=0;i<MAX_CLIENT_COUNT;i++){if(INVALID_SOCKET==Socks[i]){Socks[i]=sockResponse;break;}}if(i==MAX_CLIENT_COUNT){printf("已达到最大客户端数量%d,关闭刚建立的连接\n",MAX_CLIENT_COUNT);closesocket(sockResponse);}}}//4.2所有响应套接字(轮询)for(i=0;i<MAX_CLIENT_COUNT;i++){if(Socks[i]!=INVALID_SOCKET){if(FD_ISSET(Socks[i],&fdread)){//真正的通信,即与数据端进行数据收、发交互,调用recv/send函数keepWorking=true;//调用recv函数检测有没有数据到来recvBytes=recv(Socks[i],InBuf,sizeof(InBuf),0);switch(recvBytes){//对方关闭了连接case 0:printf("客户端[%s]已经关闭了连接,响应套接字[%d]上的连接即将断开。
\n",ClientInfo,Socks[i]);keepWorking=false;break;case SOCKET_ERROR://这种错误在非阻塞模式中很常见,它不意味着错误,而是没有数据到来、没有连接请求到来if(WSAEWOULDBLOCK!=WSAGetLastError()){printf("通信过程中出现错误,即将关闭套接字[%d]与客户端[%s]的连接。