簡體   English   中英

在Thread中運行WebSocket服務器

[英]Run WebSocket server in Thread

這可能是關於線程的問題,而不是關於我的websocket。 我正在使用github的“SimpleWebSocket”( https://github.com/dpallot/simple-websocket-server )這個例子很好用:

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):

任何想法我做錯了什么? 非常感謝!

編輯:當我運行“simpleEcho”時的結果是我得到一個提示可以通過websocket.html(在github上提供)連接,發送和接收消息

當我把它放在一個線程(我試過的3種方式中的任何一種)中的結果是相同的行為,除非我嘗試從websocket.html“連接”我得到一個“錯誤:未定義”。 我檢查了nmap,服務器似乎正在運行並監聽端口8000

編輯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()

主要的問題似乎是在那里你啟動服務器。 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()的代碼實際上在線程內部run()

請注意,由於全局解釋器鎖定,線程不會提高性能,您可能需要multiprocessing 但是,如果您只想卸載I / O等待,這應該可以正常工作。

編輯 :從查看這個GitHub項目,並重新思考你想要做的事情,這不是微不足道的。 您必須覆蓋SimpleEcho()類中的WebSocket.serveforever()並將其更改為接受套接字並將接受的套接字傳遞給Thread (請參閱此處 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM