Сервер WebSocket в PyQt5, вроде правильный, однако не могу подключиться

Мне нужно сделать сервер websocket в pyqt5, читайте документацию от версии 5.3 там есть все необходимые классы, следуйте этому примеру на C++ http://doc.qt.io/qt-5/qtwebsockets-examples.html и вот результат:

from PyQt5 import QtCore, QtWebSockets,  QtNetwork

class MyServer(QtCore.QObject):
    def __init__(self,  parent=None):
        super(QtCore.QObject, self).__init__(parent)
        self.server = QtWebSockets.QWebSocketServer('My Socket', QtWebSockets.QWebSocketServer.NonSecureMode)
        if self.server.listen(QtNetwork.QHostAddress.LocalHost, 1302):
            print('Connected: '+self.server.serverName()+' : '+self.server.serverAddress().toString()+':'+str(self.server.serverPort()))
        else:
            print('error')
        self.server.newConnection.connect(self.onNewConnection)

        print(self.server.isListening())

    def onNewConnection(self):
        print(self.sender())
        print("inside")
        self.server.textMessageReceived.connect(self.processTextMessage)
        self.server.binaryMessageReceived.connect(self.processBinaryMessage)
        self.server.disconnected.connect(self.socketDisconnected)

    def processTextMessage(self,  message):
        print(message)

    def processBinaryMessage(self,  message):
        print(message)

    def socketDisconnected(self):
        print('out')

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MyServer()
    sys.exit(app.exec_())

при запуске метода isListening возвращает true, что заставляет меня поверить, что этот код правильный, однако я пытаюсь подключиться с помощью клиента javascript (веб-сокет html5), и он возвращает мне ошибку подключения к серверу, то же самое происходит, когда я пытаюсь выстрелить в сервер телнет (телнет локальный хост 1302).


person IgorHerson    schedule 04.01.2015    source источник
comment
Вы пытаетесь это сделать на Mac? если это так, вы должны принять входящие сетевые подключения в очень коротком всплывающем окне, которое вы, возможно, пропустили. netcat или telnet не будут работать для тестирования WebSockets, какой код для вашего клиента html5?   -  person Gerard Rozsavolgyi    schedule 04.01.2015
comment
Я запускаю в Windows, запроса на исключение порта не было, я уже тестировал запуск в другом файле. если телнет не работает с вебсокетом, почему можно запустить эхо-тест? (telnet echo.websocket.org 80) Я пытаюсь подключить простой пример html5, а также плагин chrome (простой клиент websocket)   -  person IgorHerson    schedule 04.01.2015


Ответы (2)


спасибо за ответ, были и другие ошибки в коде, окончательный код если кому нужно:

from PyQt5 import QtCore, QtWebSockets,  QtNetwork, QtWidgets

class MyServer(QtCore.QObject):
    def __init__(self, parent):
        super(QtCore.QObject, self).__init__(parent)
        self.clients = []
        self.server = QtWebSockets.QWebSocketServer(parent.serverName(), parent.secureMode(), parent)
        if self.server.listen(QtNetwork.QHostAddress.LocalHost, 1302):
            print('Connected: '+self.server.serverName()+' : '+self.server.serverAddress().toString()+':'+str(self.server.serverPort()))
        else:
            print('error')
        self.server.newConnection.connect(self.onNewConnection)

        print(self.server.isListening())

    def onNewConnection(self):
        self.clientConnection = self.server.nextPendingConnection()
        self.clientConnection.textMessageReceived.connect(self.processTextMessage)

        self.clientConnection.binaryMessageReceived.connect(self.processBinaryMessage)
        self.clientConnection.disconnected.connect(self.socketDisconnected)

        self.clients.append(self.clientConnection)

    def processTextMessage(self,  message):
        if (self.clientConnection):
            self.clientConnection.sendTextMessage(message)

    def processBinaryMessage(self,  message):
        if (self.clientConnection):
            self.clientConnection.sendBinaryMessage(message)

    def socketDisconnected(self):
        if (self.clientConnection):
            self.clients.remove(self.clientConnection)
            self.clientConnection.deleteLater()


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    serverObject = QtWebSockets.QWebSocketServer('My Socket', QtWebSockets.QWebSocketServer.NonSecureMode)
    server = MyServer(serverObject)
    serverObject.closed.connect(app.quit)
    app.exec_()
person IgorHerson    schedule 05.01.2015

На самом деле есть проблема с сигналами: вам нужно подключать не сервер, а clientConnections:

def onNewConnection(self):
        clientConnection = self.server.nextPendingConnection()
        clientConnection.disconnected.connect(clientConnection.deleteLater)
        print(self.sender())
        print("inside")
        clientConnection.textMessageReceived.connect(self.processTextMessage)
        clientConnection.binaryMessageReceived.connect(self.processBinaryMessage)
        self.server.disconnected.connect(self.socketDisconnected)

Затем я пытаюсь использовать клиент html5:

<!DOCTYPE html>  
<html>
<head>
<meta charset="utf-8" />  
<title>WebSocket Test</title> 
 <script>  
 //var wsUri = "ws://echo.websocket.org/"; 
 var wsUri = "ws://127.0.0.1:1302"; 
 var output;  
 function init() { output = document.getElementById("output"); testWebSocket(); }  
 function testWebSocket() { 
    websocket = new WebSocket(wsUri); 
    websocket.onopen = function(evt) { onOpen(evt) }; 
    websocket.onclose = function(evt) { onClose(evt) }; 
    websocket.onmessage = function(evt) { onMessage(evt) }; 
    websocket.onerror = function(evt) { onError(evt) }; }  
    function onOpen(evt) { writeToScreen("CONNECTED"); doSend("WebSocket rocks"); } 
    function onClose(evt) { writeToScreen("DISCONNECTED"); } 
    function onMessage(evt) { 
        writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>'); websocket.close(); 
        }  
    function onError(evt) { writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data); } 
    function doSend(message) { 
        writeToScreen("SENT: " + message);  websocket.send(message); 
    } 
    function writeToScreen(message) { 
        var pre = document.createElement("p"); 
        pre.style.wordWrap = "break-word"; 
        pre.innerHTML = message; 
        output.appendChild(pre); }  
        window.addEventListener("load", init, false); 
 </script>
</head>
    <body>
        <h2>WebSocket Test</h2> 
         <div id="output"></div> 
    </body>
</html>

Тогда у нас есть, по крайней мере, соединение и печать клиентского сообщения «WebSocket Rocks» на стороне сервера. Но код еще не завершен

person Gerard Rozsavolgyi    schedule 04.01.2015