2015-07-25 4 views
0

Я пытаюсь написать программу, которая изменяет содержимое веб-страницы с некоторыми параметрами, заданными пользователем. После нескольких попыток и некоторого googling мне удалось получить некоторые результаты (я поместил веб-сервер в поток, чтобы продолжить другие задачи в основной рутине). Это, кажется, бежит довольно гладко в окнах, но я всегда получалКак я могу безопасно обновлять обработчик BaseHTTPServer под Linux?

socket.error: [Errno 98] Address already in use

, когда я пытаюсь это с моей 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() 

Есть ли реальное решение, чтобы избавиться от этой ошибки? Или есть лучший способ управлять обработчиком в orger, чтобы добиться моей цели?

EDIT: ошибка возникает после ввода «второго содержимого». Первый экземпляр работает безупречно, поэтому я могу точно сказать, что сокет не используется ничем другим.

Спасибо всем!

ответ

0

Я не наглядно проанализировал ваш код, но для меня это похоже, что ваш Linux-аппарат , скорее всего, работает на каком-то прокси-сервере на порту 8080 (используется стандартный порт).

Попробуйте netstat -tunlp команду и посмотрите, не произошло ли что-то еще этого порта.

Редактировать: pro tip для другого случая: на окнах skype использует порты 80 и 433 по умолчанию, это togglable в свойствах.

+1

Спасибо за ваш ответ, но я заверяю вас, что разъем не используется. –