2011-12-12 3 views
2

Мое приложение, написанное на PyQt4, похоже, не содержит никаких данных. Событие readyRead даже не запускается. Использование приложений следующее:Учетная запись udp PyQt4, похоже, не работает

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_ на нем, либо обработать вызовы 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?