Client/Server - Probleme

Alles rund um die Programmierung mit Qt
Antworten
palli
Beiträge: 10
Registriert: 26. Februar 2005 11:44

Client/Server - Probleme

Beitrag 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
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Esleborn am 16. Juli 2006 22:24, insgesamt 1-mal geändert.
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag 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
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Antworten