Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 28, 2010 11:02:18

Kyuzo
От:
Зарегистрирован: 2010-04-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

QTcpServer и стандартный socket

Здравствуйте, у меня появилась необходимость написать графическое приложение, которое выступало бы сервером для консольного клиента. В качестве графической библиотеки была выбрана QT4, пример сервера брал из книги: http://www.qtrac.eu/pyqtbook26.tar.gz (18 глава)

class Socket(QTcpSocket):

def __init__(self, parent=None):
super(Socket, self).__init__(parent)
self.connect(self, SIGNAL("readyRead()"), self.readRequest)
self.connect(self, SIGNAL("disconnected()"), self.deleteLater)
self.nextBlockSize = 0


def readRequest(self):
stream = QDataStream(self)
stream.setVersion(QDataStream.Qt_4_2)

if self.nextBlockSize == 0:
if self.bytesAvailable() < SIZEOF_UINT16:
return
self.nextBlockSize = stream.readUInt16()
if self.bytesAvailable() < self.nextBlockSize:
return

action = QString()
room = QString()
date = QDate()
stream >> action
if action in ("BOOK", "UNBOOK"):
stream >> room >> date
bookings = Bookings.get(date.toPyDate())
uroom = unicode(room)
и возникла у меня вот какая проблема, при попытке послать из стандартного клиента строку, я получал пустое место, пробовал заменить

“stream >> action” на “action = stream.readString()” результать такой же, тип получаемых данных NoneType

при отсылке ответа сервером:
    def sendError(self, msg):
reply = QByteArray()
stream = QDataStream(reply, QIODevice.WriteOnly)
stream.setVersion(QDataStream.Qt_4_2)
stream.writeUInt16(0)
#stream << QString("ERROR") << QString(msg)
stream.writeString("Helloo")
stream.device().seek(0)
stream.writeUInt16(reply.size() - SIZEOF_UINT16)
self.write(reply)
заменил передачу на writeString()
до этого данные передавались в QString и на машине без установленного QT их весьма проблемматично обрабатывать. но посылаемые writeString() данные тоже выглядели не совсем правильными, хотя и на много ближе к истине, если быть точнее, то в начале строки передавались спецсимволы “^K\000\000\000^G”

код клиента:
import socket
import sys

HOST, PORT = "localhost", 9407

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to server and send data
sock.connect((HOST, PORT))
sock.send("BOOK")
# Receive data from the server and shut down
received = sock.recv(1024).strip("^K\000\000\000^G")
sock.close()

print "Sent: %s" % data
print "Received: %s" % received
С стандартным TCP сервером клиент работает замечательно, подскажите пожалуйста, как воевать с QTcpServer дабы принимать и отсылать данные по человечески, или хотяб где про это можно прочитать, вчера весь вечер Гуглил



Офлайн

#2 Май 1, 2010 22:53:25

Kyuzo
От:
Зарегистрирован: 2010-04-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

QTcpServer и стандартный socket

мды :(

а) вопрос слишком глуп чтобы на него отвечать
б) ни кто не работал с QTcpServer



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version