如何在不使用任何库的情况下使用Python实现简单的web服务器?
我需要用Python实现一个非常简单的类似web服务器的应用程序,它将执行基本的HTTP请求和响应,并在网页上显示非常基本的输出。我并不太关心用Python编写代码,但我不确定从哪里开始?如何设置?一个文件?多个文件?我想我不知道如何处理这是一个“服务器”,所以我不知道如何处理HTTP请求/套接字/处理请求等。有什么建议吗?参考资料?您应该查看(py3:)模块 根据您尝试做什么,您可以直接使用它,也可以查看模块的源代码(,)以获取想法 如果您想获得更低级的功能,SimpleHttpServer将扩展()以使其正常工作 如果您想获得更低级的,请查看(源代码:,) 如果人们只想共享一个目录,他们通常会运行python,比如如何在不使用任何库的情况下使用Python实现简单的web服务器?,python,http,sockets,webserver,websocket,Python,Http,Sockets,Webserver,Websocket,我需要用Python实现一个非常简单的类似web服务器的应用程序,它将执行基本的HTTP请求和响应,并在网页上显示非常基本的输出。我并不太关心用Python编写代码,但我不确定从哪里开始?如何设置?一个文件?多个文件?我想我不知道如何处理这是一个“服务器”,所以我不知道如何处理HTTP请求/套接字/处理请求等。有什么建议吗?参考资料?您应该查看(py3:)模块 根据您尝试做什么,您可以直接使用它,也可以查看模块的源代码(,)以获取想法 如果您想获得更低级的功能,SimpleHttpServer将
python-msimplehttpserver
(或者python3-mshttp.server
):这是一个功能齐全的。。。简单服务器。可用于此目的。以下代码段创建tcp套接字并在端口9000上侦听http请求:
from socket import *
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
clientsocket.send("HTTP/1.1 200 OK\n"
+"Content-Type: text/html\n"
+"\n" # Important!
+"<html><body>Hello World</body></html>\n")
clientsocket.shutdown(SHUT_WR)
clientsocket.close()
serversocket.close()
createServer()
从套接字导入*
def createServer():
serversocket=socket(AF\u INET,SOCK\u STREAM)
绑定(('localhost',9000))
serversocket.listen(5)
而(一):
(clientsocket,address)=serversocket.accept()
clientsocket.send(“HTTP/1.1 200确定\n”
+“内容类型:text/html\n”
+“\n”#重要!
+“你好,世界\n”)
clientsocket.关机(关机)
clientsocket.close()
serversocket.close()
createServer()
启动服务器,$python server.py
。
打开http://localhost:9000/
在web浏览器中(充当客户端)。然后在浏览器窗口中,您可以看到文本“Hello World”(http响应)
编辑**
前面的代码只在chrome上测试过,正如你们对其他浏览器的建议,代码被修改为:
shutdown()
然后在chrome、firefox()和simplecurlinterminal(curl)上对代码进行了测试 我决定在Python3中实现这一点,并将其用于Chrome,作为我正在开发的在线课程的示例。Python 3当然需要将
encode()
和decode()
放在正确的位置。Chrome-确实希望在获取数据之前发送其GET请求。我还添加了一些错误检查,以便在您中止服务器或服务器崩溃时清理其套接字:
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
try :
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
rd = clientsocket.recv(5000).decode()
pieces = rd.split("\n")
if ( len(pieces) > 0 ) : print(pieces[0])
data = "HTTP/1.1 200 OK\r\n"
data += "Content-Type: text/html; charset=utf-8\r\n"
data += "\r\n"
data += "<html><body>Hello World</body></html>\r\n\r\n"
clientsocket.sendall(data.encode())
clientsocket.shutdown(SHUT_WR)
except KeyboardInterrupt :
print("\nShutting down...\n");
except Exception as exc :
print("Error:\n");
print(exc)
serversocket.close()
print('Access http://localhost:9000')
createServer()
但这是一个非常好的例子,主要说明了为什么您希望使用Flask或DJango之类的框架,而不是编写自己的框架。感谢您的初始代码。上面提到了一个非常简单的解决方案,但上面的解决方案不起作用。该解决方案在chrome上进行了测试,效果良好。这是Python3,尽管它可能在Python2上工作,因为我从未测试过它
from socket import *
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
clientsocket.send(bytes("HTTP/1.1 200 OK\n"
+"Content-Type: text/html\n"
+"\n" # Important!
+"<html><body>Hello World</body></html>\n",'utf-8'))
clientsocket.shutdown(SHUT_WR)
clientsocket.close()
serversocket.close()
createServer()
从套接字导入*
def createServer():
serversocket=socket(AF\u INET,SOCK\u STREAM)
绑定(('localhost',9000))
serversocket.listen(5)
而(一):
(clientsocket,address)=serversocket.accept()
clientsocket.send(字节)(“HTTP/1.1 200确定\n”
+“内容类型:text/html\n”
+“\n”#重要!
+“Hello World\n”、“utf-8”))
clientsocket.关机(关机)
clientsocket.close()
serversocket.close()
createServer()
这比已被接受的答案有所改进,但我将发布这篇文章,以便将来的用户可以轻松使用。进一步解释您的要求(以及原因)。您是想实现完整的应用程序级堆栈,还是可以使用Apache?更多地解释你需要什么以及为什么。最后,当您有“websocket”标记时,您的意思是它,还是仅仅使用了一个不正确的标记?没有使用任何库?肯定至少需要
socket
?检查页面,这里我假设“任何库”都是python安装中未包含的库。@Wooble:我认为假设“任何库”是指“任何非标准库”是相当公平的。我可能会说您应该先检查HTTP文档。像RFC-1。你试过这个吗?这根本不起作用;它是一个套接字服务器,但不讲HTTP。它实际上不讲HTTP,所以几乎每个浏览器都不能使用它。它在Chrome中不起作用。只有在Firefox中按下停止按钮,它才能工作。这不是一个web服务器。我复制了你的脚本并运行了它,我收到一个错误,它说需要一个类似字节的对象而不是'str'
如何修复这个问题?@Simon稍微修改了代码。它也在Python2.7.6上进行了测试。如果您使用的是python 3,其中字符串是Unicode;但在网络上传输时,我们需要发送字节字符串。因此,尝试sendall()而不是send(),字符串输出编码为utf-8#START output=“It works”clientsocket.sendall(output.encode(“utf-8”)#ENDSuper!这正是我需要的。我确实使用Python3,因此'sendall()`和.encode(“utf-8”)
是绝对必要的,这两个选项都修复了我遇到的错误。到目前为止,我所有的服务器尝试都失败了,所以我非常感激。这是一次当之无愧的投票,但是我不喜欢clientsocket.send(“HTTP/1.1 200 OK\n”+”内容类型:text/html\n“+”\n”#重要!+“Hello World\n”)
这不应该是同一行吗?我不得不修改那部分。再次感谢。:)欢迎来到堆栈溢出。这个问题几乎是重复的。唯一
from socket import *
def createServer():
serversocket = socket(AF_INET, SOCK_STREAM)
serversocket.bind(('localhost',9000))
serversocket.listen(5)
while(1):
(clientsocket, address) = serversocket.accept()
clientsocket.send(bytes("HTTP/1.1 200 OK\n"
+"Content-Type: text/html\n"
+"\n" # Important!
+"<html><body>Hello World</body></html>\n",'utf-8'))
clientsocket.shutdown(SHUT_WR)
clientsocket.close()
serversocket.close()
createServer()