2016-07-11 3 views
1

это, вероятно, больше вопрос о потоковом использовании, чем о моем веб-сайте. Я использую «SimpleWebSocket» из GitHub (https://github.com/dpallot/simple-websocket-server) пример работает отлично:Запустите сервер WebSocket в потоке

from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket 

class SimpleEcho(WebSocket): 

    def handleMessage(self): 
     # echo message back to client 
     self.sendMessage(self.data) 

    def handleConnected(self): 
     print self.address, 'connected' 

    def handleClose(self): 
     print self.address, 'closed' 

server = SimpleWebSocketServer('', 8000, SimpleEcho) 
server.serveforever() 

Сервер работает, я могу подключиться и отправлять сообщения.

Теперь я пытаюсь запустить его как тему с этими классами: Это одна предполагается создать много потоков, в том числе WebSocketServer

from websockethread import WebSocketThread 
class startManyThreads: 
    def __init__(self): 
     self.thread1 = WebSocketThread() 
     self.thread1.start() 

if __name__ == "__main__": 
    startManyThreads = startManyThreads() 

Этот класс должен работать как мой резьбы:

import threading 
from SimpleWebSocketServer import SimpleWebSocketServer 
from webSocketServer import WebSocketServer 

class WebSocketThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     server = SimpleWebSocketServer('', 8000, WebSocketServer) 
     server.serveforever() 

И это «индивидуальный» пример эха:

from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket 

class SimpleEcho(WebSocket): 

    def handleMessage(self): 
     # echo message back to client 
     self.sendMessage(self.data) 

    def handleConnected(self): 
     print self.address, 'connected' 

    def handleClose(self): 
     print self.address, 'closed' 

Я также попытался получить следующее: class SimpleEcho(WebSocket, threading.Thread):

Любые идеи, что я делаю неправильно? & Спасибо заблаговременно!

Edit: В результате, когда я бегу «simpleEcho» является то, что я получаю приглашение можно подключить через websocket.html (при условии, на GitHub), отправлять и получать сообщения

В результате, когда я положил его в нить (любой из трех способов, которые я пытался), такое же поведение, за исключением случаев, когда я пытаюсь «подключиться» к websocket.html, я получаю «error: undefined». С птар я проверил и сервер кажется так работать & прослушивает порт 8000

Edit 2: Производное новый класс от SimpleWebSocketServer

import threading 

from SimpleWebSocketServer import SimpleWebSocketServer 

class ThreadSimpleWebSocketThread(threading.Thread, SimpleWebSocketServer): 
    def __init__(self, serversocket): 
     threading.Thread.__init__(self) 
     self.serversocket = serversocket 

    def serveforever(self): 
     SimpleWebSocketServer.serversocket = self.serversocket 
     SimpleWebSocketServer.selectInterval = 0.1 
     SimpleWebSocketServer.listeners = [self.serversocket] 
     super(ThreadSimpleWebSocketThread, self).serveforever() 

    def run(self): 
     self.serveforever() 
+0

Каково ожидаемое поведение и фактическое поведение? – merlin2011

+0

Ожидаемое поведение будет заключаться в том, что я могу подключиться к «тестовому клиенту», предоставленному на github. Фактическое поведение заключается в том, что я получаю «неопределенную ошибку» (в тесте «Домашняя страница»), как только я запускаю ее как поток.нет ошибок в другом месте – Markus

ответ

0

Основная проблема, как представляется, где вы запускаете сервер, , Метод Thread.__init__() выполняется внутри основного потока (вызывающего абонента ), а не фактического WebSocketThread(). Это должно быть сделано в методе Thread.run():

class WebSocketThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 

    def run(self): 
     server = SimpleWebSocketServer('', 8000, WebSocketServer) 
     server.serveforever() 

Код внутри run() фактически работает внутри потока.

Обратите внимание, что из-за блокировки Global Interpreter Lock потоки не улучшат производительность, и вам, вероятно, понадобится multiprocessing. Однако, если вы просто хотите отключить ожидание ввода/вывода, это должно работать нормально.

Редактировать: От взгляда на этот проект GitHub и переосмысления того, что вы пытаетесь сделать, это не тривиально. Вам необходимо переопределить WebSocket.serveforever() в вашем классе SimpleEcho() и изменить его, чтобы принять сокет и передать принятый сокет в Thread (см. here).

+0

Я использую потоки, потому что есть множество других вещей, сделанных одновременно. Я уже пробовал этот метод. Со стороны Python это похоже на его работу (просто пустое приглашение в консоли - как и автономная версия), но я всегда получаю ошибку в ошибке «undefined» – Markus

+0

Можете ли вы редактировать и показывать полный код внизу после создания исправления здесь в моем ответе? – Will

+0

Это как раз код выше (из моего начального сообщения), а класс «WebSocketThread» - это один из ваших сообщений (копирование и вставка). Кажется, работает, но я не могу подключиться. nmap также Показывает, что порт 8000 открыт и прослушивается – Markus

Смежные вопросы