【问题标题】:serving html with the socket module使用 socket 模块提供 html
【发布时间】:2021-03-24 09:25:09
【问题描述】:

我使用 python 套接字打开了 8080 端口: sk.bind(ip_addrr, 8080) 但我希望它在该端口中打开一个 html 页面,这样当我在浏览器中导航到 :8080 时,我必须获得一个网页。有什么想法吗?

我的问题是我需要获取一个我创建的 html 页面,以显示在端口 8080 中。例如,我有类似的端口 80 的 index.html,我需要在端口 8080 中有一个 html 页面。如何我这样做?

【问题讨论】:

  • 这取决于您公开端口的网络接口。 ip_adder 变量是您在技术上需要使用的。 ip_addr:port 如果 ip addr 是 0.0.0.0 那么它将在所有网络接口上公开。所以 localhost 在这种情况下有效。无论如何,您可能可以尝试在浏览器中访问localhost:8080。
  • 不,我的问题是我需要获取我创建的 html 页面,以便在端口 8080 中显示。例如,我有类似的端口 80 的 index.html,我需要有一个 html 8080 端口中的页面。我该怎么做?
  • 请edit您的问题并添加更多详细信息。将您的代码(minimal reproducible example)复制并粘贴到问题中。您希望您的 Python 脚本提供网页吗?然后你的脚本必须处理 HTTP。可能有可用的库,或者您可以自己实现一个简约的 HTTP。

标签: html linux python-sockets


【解决方案1】:

经过一些研究,我能够整理出非常小的示例。你也可以在https://replit.com/@bluebrown/python-socket-html找到这个

import socket

s = socket.socket()
s.bind(('0.0.0.0', 8080))
s.listen(1)

with open('index.html', 'rb') as file:
  html = file.read()
  while True:    
    conn, addr = s.accept()
    with conn:
      print('Connected by', addr)
      req = conn.recv(1024)
      print('request:', req)
      conn.send('HTTP/1.1 200 OK\nContent-Type: text/html\n\n'.encode())
      conn.sendall(html)

根据您的要求,我已经采取了更进一步的措施。不过不多。足以让您了解如何为不同的页面提供服务。

import socket

def parseRequest(request):
  output = {}
  r = request.decode("utf-8").split("\r\n")
  parts = r[0].split(' ')
  output["method"] = parts[0]
  output["path"] = parts[1]
  output["protocol"] = parts[2]
  output["headers"] = { (kv.split(':')[0]): kv.split(':')[1].strip() for kv in r[1:] if (len(kv.split(':')) > 1) }
  return output

s = socket.socket()
s.bind(('0.0.0.0', 8080))
s.listen(1)

while True:    
  conn, addr = s.accept()
  with conn:
    print('Connected by', addr)
    req = conn.recv(1024)
    r = parseRequest(req)
    path = r["path"][1:]
    if (path == ""): 
      path = "index"
    with open(f'{path}.html', 'rb') as file:
      html = file.read()
      conn.send('HTTP/1.1 200 OK\nContent-Type: text/html\n\n'.encode())
      conn.sendall(html)

您可以查看更新的repl。

【讨论】:

  • 嘿伙计,感谢您的解决方案。它完全按照我的预期工作。html 文件(在我的情况下为 403.html)在端口上成功打开。但是,我已经链接了另一个 html页面到(403.html),作为href链接,也在同一目录下。但是点击链接时链接页面打不开
  • @Trapmap 很快就会变得相当复杂。也许您想改用框架。 Flask 很好很简单。如果我的回答对您有帮助,请考虑接受并留下投票。
  • 一般情况下,你想读取请求并查看路径并打开与路径同名的文件。我认为如果你愿意,你将能够做到这一点。对于学习来说还可以,但对于生产来说,我肯定会使用框架。
  • @Trapmap,我已经更新了我的答案,以展示你如何做到这一点。
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2018-04-01
  • 2019-07-03
  • 1970-01-01
相关资源
最近更新 更多