2015-05-30 34 views
1


我有一個小程序,我沒有收到服務器的響應。
這是在Ubuntu 14.04上使用python 3.4和最新的zeromq和pyqt5。

客戶端GUI向服務器發送一條消息,獲取該消息並作出響應,但客戶端沒有看到響應。Python GUI無法捕獲zeromq消息

下面是代碼:
miniServer.py:

import os 
import sys 
import time 
import zmq 
from zmq.eventloop import ioloop 
from zmq.eventloop.zmqstream import ZMQStream 

# Prepare for client socket 
ctx = zmq.Context.instance() 
sIn = ctx.socket(zmq.PULL) 
urlIn = 'tcp://127.0.0.1:1234' 
sIn.bind(urlIn) 
# Prepare for sockets to GUI and Web 
guiCalled = False 
webCalled = False 
urlGui = 'tcp://127.0.0.1:2345' 
urlWeb = 'tcp://127.0.0.1:3456' 
sGUI = None 
sWeb = None 

def __GetConfig__(sender, data): 
    if "GUI" == sender: 
     print("Sending back config list to GUI") 
     sGUI.send_string("From Server to GUI") 
    elif "WEB" == sender: 
     sWeb.send_string("From Server to Web") 
def __CheckGUICalled__(): 
    # Used to only connnect once 
    global guiCalled 
    global sGUI 
    if not guiCalled: 
     print("Connected to client GUI at port 2345") 
     guiCalled = True 
     sGUI = ctx.socket(zmq.PUSH) 
     sGUI.connect(urlGui) 
def __CheckWebCalled__(): 
    # Used to only connnect once 
    global webCalled 
    global sWeb 
    if not webCalled: 
     webCalled = True 
     sWeb = ctx.socket(zmq.PUSH) 
     sWeb.connect(urlWeb) 

actions = { 
    "GET_CONFIG": __GetConfig__} 
clients = { 
    "GUI": __CheckGUICalled__, 
    "WEB": __CheckWebCalled__} 

def check_msg(msg): 
    newStr = msg[0].decode("utf-8", "strict") 
    if newStr.count(":") == 2: 
     [sender, command, data] = newStr.split(":") 
     print("Sender: " + sender + ", Command: " + command + ", Data: " + data) 
     # connect if not already done 
     clients.get(sender, lambda: None)() 
     # execute the command sent from client 
     actions.get(command, lambda: None)(sender, data) 

# register the check_msg callback to be fired 
# whenever there is a message on our socket 
stream = ZMQStream(sIn) 
stream.on_recv(check_msg) 

# Setup callback handling the XMOS 
tic = time.time() 
def xmos_handler(): 
    # just testing 
    print("Loop time: %.3f" % (time.time() - tic)) 

pc = ioloop.PeriodicCallback(xmos_handler, 200) 
pc.start() 

# start the eventloop 
ioloop.IOLoop.instance().start() 


miniGUI.py:

import os 
import sys 
import zmq 
from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 
from zmq.eventloop.zmqstream import ZMQStream 

# prepare out socket to server 
ctx = zmq.Context.instance() 
sOut = ctx.socket(zmq.PUSH) 
sOut.connect('tcp://127.0.0.1:1234') 

# handle inputs from server 
def check_msg(msg): 
    newStr = msg[0].decode("utf-8", "strict") 
    print("Message: " + newStr + " received") 
sIn = ctx.socket(zmq.PULL) 
sIn.bind('tcp://127.0.0.1:2345') 
stream = ZMQStream(sIn) 
stream.on_recv(check_msg) 

# setup window 
class Form(QWidget): 
    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 
     nameLabel = QLabel("Name:") 
     self.nameLine = QLineEdit() 
     self.submitButton = QPushButton("Submit") 
     buttonLayout1 = QVBoxLayout() 
     buttonLayout1.addWidget(nameLabel) 
     buttonLayout1.addWidget(self.nameLine) 
     buttonLayout1.addWidget(self.submitButton) 
     self.submitButton.clicked.connect(self.submitContact) 
     mainLayout = QGridLayout() 
     mainLayout.addLayout(buttonLayout1, 0, 1) 
     self.setLayout(mainLayout) 
     self.setWindowTitle("For Test: GUI:GET_CONFIG:0") 

    def submitContact(self): 
     name = self.nameLine.text() 
     sOut.send_string(name) 
     print("Message " + name + " sent") 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    screen = Form() 
    screen.show() 
    sys.exit(app.exec_()) 

在一個treminal首先啓動服務器:

python3。 4 miniServer.py

,然後將GUI:

python3.4 miniGUI.py

寫在編輯插件的字符串:

GUI:GET_CONFIG:0

and pressi納克提交按鈕將打印在服務器控制檯上:

發件人:圖形用戶界面,命令:GET_CONFIG,數據:0

在端口2345

連接到客戶端GUI發回的配置列表GUI

和GUI控制檯只會

消息GUI上:GET_C ONFIG:0發送

寫入,而預期的結果應該是:

消息GUI:GET_CONFIG:0發送

消息:從服務器到GUI收到

我究竟做錯了什麼?

回答

0

解決方案是使用套接字類型REQ/REP,而不是PUSH/PULL,這使得代碼也更清晰。