Seite 1 von 1

[gelöst]Client/Server Daten hin-und herschicken über Streams

Verfasst: 25. September 2007 16:42
von PhilipLB
Hi,
ich komm hier nicht mehr weiter, die Streams machen einfach nicht, was sie sollen...


Aus dem Server der Abschick-Teil:

Code: Alles auswählen

			quint16 personCount;
			personCount = cam->getPersonCount();
			qDebug() << personCount;
			*out << personCount;
			write(block);
			flush();
out wurde vorher an einer anderen Stelle initialisiert:

Code: Alles auswählen


	out = new QDataStream(&block, QIODevice::WriteOnly);
	out->setVersion(QDataStream::Qt_4_0);
block ist einfach eine Membervariable der Klasse, ein QByteArray.

Hier aus dem Clienten der relevante Code:

Code: Alles auswählen

    QDataStream in(&socket);
    in.setVersion(QDataStream::Qt_4_0);

	qDebug("Data available!");


    if (blockSize == 0) {
        if (socket.bytesAvailable() < (int)sizeof(quint16))
            return;

        in >> blockSize;
    }

    qDebug() << socket.bytesAvailable();
    qDebug() << blockSize;
blockSize ist ein quint16.
personCount, was abgeschickt wird, hat den Wert 3. Ankommen tut irgendwas mit 32234!? socket.bytesAvailable() gibt 4 zurück, kann das stimmen?

Verfasst: 25. September 2007 17:11
von CaptnChaos
ich machs mit Server und client, per QBuffer. Hier die relevanten Funktionen. Sollte auch mittles client zu client funktioniern.

Client:

Code: Alles auswählen

private:
	QTcpSocket*		socket;
	QBuffer*		buffer;

QChatClient::QChatClient(QWidget* parent, Qt::WFlags flags) 
: QMainWindow(parent, flags)
{
	
	buffer = new QBuffer(this);
	socket = new QTcpSocket(this);
	buffer->open(QIODevice::ReadWrite);
	
}

void QChatClient::toggleConnection()
{
	if (socket->state() == QAbstractSocket::UnconnectedState)
	{
		socket->connectToHost(server, port);
	}
	
	else
	{
		socket->disconnectFromHost();
	}
}

void QChatClient::receiveMessage()
{
	// missing some checks for returns values for the sake of simplicity
	qint64 bytes = buffer->write(socket->readAll());
	// go back as many bytes as we just wrote so that it can be read
	buffer->seek(buffer->pos() - bytes);
	// read only full lines, line by line
	while (buffer->canReadLine())
	{
		QString line = buffer->readLine();
		
	}
}
Server:

Code: Alles auswählen

private:
	QHash<QTcpSocket*, QBuffer*> buffers;
void QChatServer::addConnection()
{
	QTcpSocket* connection = nextPendingConnection();
	connections.append(connection);
	QBuffer* buffer = new QBuffer(this);
	buffer->open(QIODevice::ReadWrite);
	buffers.insert(connection, buffer);
	connect(connection, SIGNAL(disconnected()), SLOT(removeConnection()));
	connect(connection, SIGNAL(readyRead()),	SLOT(receiveMessage()));
}

void QChatServer::removeConnection()
{
	QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
	QBuffer* buffer = buffers.take(socket);
	QByteArray t = nicks.at(connections.indexOf(socket));
	nicks.removeAll(t);
	buffer->close();
	buffer->deleteLater();
	connections.removeAll(socket);
	socket->deleteLater();
}

void QChatServer::receiveMessage()
{
	QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
	QBuffer* buffer = buffers.value(socket);
	
	// missing some checks for returns values for the sake of simplicity
	qint64 bytes = buffer->write(socket->readAll());
	// go back as many bytes as we just wrote so that it can be read
	buffer->seek(buffer->pos() - bytes);
	// read only full lines, line by line
	while (buffer->canReadLine())
	{
		QByteArray line = buffer->readLine();
		
			qDebug(line);
			foreach (QTcpSocket* connection, connections)
			{
				connection->write(line);
			}
		
	}
}
Hoffe das hilft dir.

Verfasst: 25. September 2007 17:50
von PhilipLB
Danke für den Code, aber QBuffer schien nicht geeignet für mich. :)
Hab den Fehler ENDLICH gefunden: blockSize war nicht initialisiert. Manchmal.... *args*