2011-12-12 3 views
2

PyQt4で書かれた私のアプリケーションはデータを取得していないようです。 readyReadイベントは起動されません。アプリケーションの 使用は以下の通りです:あなたのクライアントでPyQt4のudpブロードキャストが動作しないようです。

python server.py -s -p 50000 #(server on port 50000) 
python server.py -c -p 50000 #(client sending data to port 50000) 

//

import sys 
import time 

from PyQt4 import QtNetwork, QtCore 
from optparse import OptionParser 

class Server(object): 

    def __init__(self, port): 

     self.port = port 

     try: 
      self.socket = QtNetwork.QUdpSocket() 
      self.socket.bind(QtNetwork.QHostAddress.Broadcast, int(self.port), QtNetwork.QUdpSocket.ShareAddress) 

      self.socket.readyRead.connect(self.receiver) 

     except QtNetwork.QUdpSocket.NetworkError: 
      print "EXCEPTION DURING INITIALIZING SERVER'S SOCKET" 
      sys.exit(1) 

    def receiver(self): 
     print "DEBUG: RECEIVE" 
     while(self.socket.hasPendingDatagrams()): 
      try: 
       size = self.socket.pendingDatagramSize() 
       msg, host, port = self.socket.readDatagram(size) 
      except: 
       print "EXCEPTION DURING RECEIVEING AND READING DATAGRAM" 
      else: 
       print "HOST %s:%s MSG: %s" % (str(host), str(port), str(msg)) 

    def __del__(self): 
     print "DESTRUCTOR" 
     self.socket.close() 

class Client(object): 

    def __init__(self, port): 

     self.port = port 

     try: 
      self.socket = QtNetwork.QUdpSocket() 
     except: 
      print "EXCEPTION DURING INITIALIZING CLIENT'S SOCKET" 

     self.main_loop() 

    def main_loop(self): 
     for i in range(20): 
      self.debug_msg() 
      time.sleep(0.5) 
     print "EXITING" 
     self.socket.close() 


    def debug_msg(self): 
     msg = "DEBUG" 
     self.socket.writeDatagram(msg, QtNetwork.QHostAddress.Broadcast, int(self.port)) 


if __name__ == "__main__": 

    parser = OptionParser() 
    parser.add_option("-p", "", action="store", type="string", dest="port") 
    parser.add_option("-c", "", action="store_true", dest="client") 
    parser.add_option("-s", "", action="store_true", dest="server") 

    options, args = parser.parse_args() 

    if not (options.server or options.client): 
     print "Client/Server not specified. Could not continue..." 
     sys.exit(1) 

    elif not options.port: 
     print "Server's port not specified. Could not continue..." 
     sys.exit(1) 

    else: 

     if options.server: 
      serv = Server(options.port) 

      App = QtCore.QCoreApplication(sys.argv) 
      sys.exit(App.exec_()) 
     else: 
      client = Client(options.port) 

答えて

1

は、あなたがQtのイベントループを開始されていません。アプリケーションオブジェクトを割り当て、exec_を呼び出してtimerを介してdebug_msg呼び出しを処理するか、QCoreApplication.processEvents()を使用してイベントループをポンピングする必要があります。

別のオプションは、フラッシュを使用することです():

http://doc.qt.nokia.com/latest/qabstractsocket.html#flush

bool QAbstractSocket::flush()

この機能は、基盤となるネットワークソケットへ バッファはブロックせずに、内部の書き込みからできるだけ多くの書き込みを行います。データ が書き込まれた場合、この関数はtrueを返します。それ以外の場合はfalseが返されます。

バッファリングされたデータの送信をすぐに開始するには、QAbstractSocketが必要な場合はこの関数を呼び出します。書き込まれたバイト数は、オペレーティングシステムによって異なります。 ほとんどの場合、 はこの機能を呼び出す必要はありません.QAbstractSocketは、制御がイベントループに戻ったときに自動的にデータ の送信を開始するためです。イベントループのある がない場合は、代わりにwaitForBytesWritten()を呼び出します。

0

QtNetwork.QUdpSocket.NetworkErrorは例外ではなく、単なる定数です。そして、なぜソケットをQHostAddress.Broadcastにバインドするのですか?代わりにQHostAddress.Anyが必要ですか?

関連する問題