【问题标题】:How can I safely update the handler of a BaseHTTPServer under Linux?如何在 Linux 下安全地更新 BaseHTTPServer 的处理程序?
【发布时间】:2015-07-25 14:10:05
【问题描述】:

我正在尝试编写一个程序,该程序可以使用一些用户给定的参数来更改网页的内容。经过几次尝试和一些谷歌搜索,我设法得到了一些结果(我将网络服务器放在一个线程中以便继续主程序中的其他任务)。它似乎在 Windows 中运行得相当流畅,但我总是得到一个

socket.error: [Errno 98] 地址已在使用中

当我从我的 linux 机器上尝试时(整个过程最后必须在 raspian 上运行)。

我读到了 here 的内容,它解释了 SO_REUSEADDR 套接字选项(我认为它与此有关)在不同的操作系统之间具有不同的行为(如果我没有误解,它在 Windows 上“工作”,这要归功于一个错误) ,但我找不到解决方案让它在 Linux 上以这种方式工作,因为默认情况下此选项已设置为 True。

这是生成错误的代码的简化摘要:

import web

probe = raw_input("1st content: ")
web.web(probe)

probe = raw_input("2nd content: ")
web.web(probe)

raw_input()

使用此模块 (web.py)

# -*- coding: utf8 -*-

def web(text):
    from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
    from SocketServer   import ThreadingMixIn
    import threading


    class Handler(BaseHTTPRequestHandler):

        def do_GET(self):
            self.send_response(200)
            self.end_headers()
            self.wfile.write(bytes(text.encode('utf-8')))
            self.wfile.close()
            return

    class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
        allow_reuse_address = True

    server = ThreadedHTTPServer(('', 8080), Handler)
    print 'Now serving, use <Ctrl+C> to break'

    thread = threading.Thread(target = server.serve_forever)
    thread.daemon = True
    thread.start()

是否有真正的解决方案来消除此错误?或者有没有更好的方法来管理处理程序以实现我的目标?

编辑:输入“第二个内容”后发生错误。第一个实例运行完美,所以我可以确定套接字没有被其他任何东西使用。

谢谢大家!

【问题讨论】:

    标签: python basehttpserver basehttprequesthandler


    【解决方案1】:

    我没有彻底分析您的代码,但在我看来,您的 linux 机器很可能在端口 8080(使用标准端口)上运行某种代理服务。

    尝试 netstat -tunlp 命令,看看是否有东西没有占用该端口。

    编辑: 另一个场合的专业提示:在 Windows Skype 上,默认情况下使用端口 80 和 433,它可以在属性中切换。

    【讨论】:

    • 感谢您的回答,但我向您保证该套接字未被使用。
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多