Seite 1 von 1

Client/Server - Probleme

Verfasst: 16. Juli 2006 20:08
von palli
Nachdem mir hier schon mehrfach super geholfen werden konnte hier eine neue Sache bei der ich feststecke:

Ich schreibe gerade ein Projekt mit einer Server/Client Struktur. Dabei habe ich mich eng an die Beispiele von der Trolltech HP gehalten und es geht auch fast alles.

Ich rufe erst das Programm mit dem Server auf, dann das 2. Programm mit dem Client. Der verbindet erfolgreich mit dem Server und von der Server-Seite kann ich auch beliebige Kommandos an den Client schicken. Jetzt mein Problem: wie kann ich vom Client Daten an den Server schicken, die der auslesen und dann abhängig von den eingegangenen Daten verarbeiten kann?

Vielen Dank schonmal für jede Hilfe!

palli

Verfasst: 16. Juli 2006 22:07
von Esleborn
für jeden connecteten Client ein entsprechendes Objekt auf dem Server erstellen, und dessen Signal exakt so verarbeiten wie auf Client Seite (nur eben für jeden Client)

In code: (wenn NewConnection ( ) mit dem Server signal newConnection() verbunden ist und MySlotForIncomingData ( ) ein slot des Servers ist, der die Daten verarbeitet)

Code: Alles auswählen

void C_AbstractServer::NewConnection  ( )
{
   while ( hasPendingConnections ( ) )
   {
      QTcpSocket *p_socket ( nextPendingConnection ( ) );

      if ( p_socket == NULL )
         continue;

      connect ( p_socket, SIGNAL ( disconnected ( ) ), p_socket, SLOT ( deleteLater ( ) ) );
      connect ( p_socket, SIGNAL ( readyRead ( ) ), this, SLOT ( MySlotForIncomingData ( ) ) );
   }
}
ersatzweise kannst du (ist effektiver) void QTcpServer::incomingConnection ( int socketDescriptor ) überladen und selbiges machen:

Code: Alles auswählen

void C_AbstractServer::incomingConnection ( int f_socketDescr )
{
   while ( hasPendingConnections ( ) )
   {
      QTcpSocket *p_socket = new QTcpSocket ( this );
      p_socket->setSocketDescriptor ( f_socketDescr );

      connect ( p_socket, SIGNAL ( disconnected ( ) ), p_socket, SLOT ( deleteLater ( ) ) );
      connect ( p_socket, SIGNAL ( readyRead ( ) ), this, SLOT ( MySlotForIncomingData ( ) ) );
   }
}
Elgrimm Esleborn

Verfasst: 16. Juli 2006 22:23
von Esleborn
eine weitere nette Funktion ist das Senden von Daten an alle Clients, zB so implementiert (wenn ml_clients eine Liste von Streams auf die Client-Sockets ist)

Code: Alles auswählen

template <class T> C_AbstractServer& operator<< ( const T &f_object )
{
   foreach ( C_Client *p_client, ml_clients )
      *p_client << f_object;
		
   return *this;
}
Wenn du so eine Liste erstellst, musst du nat. dafür sorgen, dass disconnectende Clients aus der List gestrichen werden und gelöscht werden... (Ebenso wie ihre Streams)


Elgrimm Esleborn