首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebSocket服务器在PyQt5中,显然是正确的,但是我无法连接

WebSocket服务器在PyQt5中,显然是正确的,但是我无法连接
EN

Stack Overflow用户
提问于 2015-01-04 17:00:01
回答 2查看 2.6K关注 0票数 1

我需要在pyqt5中创建一个websocket服务器,阅读5.3版本的文档--所有必需的类,按照C ++ http://doc.qt.io/qt-5/qtwebsockets-examples.html中的示例进行操作,结果是:

代码语言:javascript
复制
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 websocket)连接并返回服务器连接错误,在我尝试通过telnet (telnet 1302)拍摄服务器时也是如此。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-05 00:50:41

感谢您的回复,代码中有其他错误,如果有人需要的话,最后的代码:

代码语言:javascript
复制
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_()
票数 2
EN

Stack Overflow用户

发布于 2015-01-04 22:02:51

事实上,信号存在一个问题:您不必连接服务器,而是连接clientConnections:

代码语言:javascript
复制
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客户端:

代码语言:javascript
复制
<!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“的连接和打印。但是代码还有待完成

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27767985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档