Mobile

C# Server zum verteilen von Anfragen

ete

Cadet 4th Year
Registriert
Jan. 2011
Beiträge
89
Hallo zusammen!
Ich schreibe einen kleinen Server in C#. Diese soll ähnlich wie ein Proxy funktionieren. Der Server wartet auf eine Anfrage (vermutlich über TcpListener realisiert?). Sendet ein Client eine Anfrage, soll diese an einen anderen Server weitergeleitet werden. Das ganze dann natürlich auch rückwärts mit der entsprechenden Antwort. Soweit also wie ein Proxy.
Speziell geht es mir aber nicht um das Umgehen von irgendwelchen Schranken. Der Server soll eine Weiche darstellen. Es geht um die Verbindung eines Clients mit einer Datenbank. Der gewünschte Server soll zwischen den beiden stehen. Er nimmt die Anfrage vom Client an. Dann leitet er diese entweder an einen (neu hinzukommenden Cache-) Server weiter oder (wenn der Cache keine Antwort hat) an die eigentliche Datenbank. Das Ergebnis des Cache bzw. der DB soll dann wieder an den Client zurück.
Eines der Probleme ist, dass der Client nicht editierbar ist. Er erwartet also als "Gegenspieler" eine Datenbank. Entweder der gesuchte Server ist also für den Client unsichtbar, oder der neue Server gibt sich "einfach" als Datenbank aus. Beides habe ich leider momentan noch nicht hinbekommen.

Nochmal als Zusammenfassung:

Der Server soll folgendes machen:

- Anfrage vom Client annehmen
- Nach einer Programmlogik entscheiden ob Anfrage an Server A (z.B. Cache) oder B (z.B. Datenbank) weitergeleitet wird
- entsprechend Weiterleiten
- erhaltene Antwort an den Client zurücksenden.

Vielen Dank für Ideen!
 
Habe Probleme diesen Server zu realisieren. Bis jetzt habe ich einen TcpListener und einen Networkstream. Es kommen auch Daten an, allerdings nichts vernünftiges (vermutlich falsches Encoding bein anzeigen?). Dann klappt das mit dem Weiterleiten an einen anderen Server auch nicht. Reiner Echo-Server (also alles direkt zurückschicken) funktioniert. Erfüllt aber natürlich nicht die Aufgabe. Daher die Frage, mit welchen Mitteln so ein Server geschrieben werden kann. Hier mal ein paar Zeilen:

Code:
 TcpClient client = listener.AcceptTcpClient();
            NetworkStream clientStream = client.GetStream();
            byte[] message = new byte[4096];
            int bytesRead;
            while (true)
            {
                if (clientStream.CanRead)
                {
                    byte[] myReadBuffer = new byte[4096];
                    StringBuilder myCompleteMessage = new StringBuilder();
                    bytesRead = 0;
                    do
                    {
                        bytesRead = clientStream.Read(myReadBuffer, 0, myReadBuffer.Length);

                        myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, bytesRead));
                    }
                    while (clientStream.DataAvailable);
                    Trace.WriteLine(myCompleteMessage);
                    break;
                }
                else
                {
                    Trace.WriteLine("error");
                    break;
                }
            }

Empfängt Daten und schreibt diese in die Console (zu Testzwecken).
 
ete schrieb:
Es kommen auch Daten an, allerdings nichts vernünftiges (vermutlich falsches Encoding bein anzeigen?).

Ah, wir kommen der Sache näher. ;)
Was kommt denn genau an? Und wieso gehst du davon aus, dass das Encoding ASCII entspricht? Die meisten Programme verwenden doch mittlerweile UFT-8 oder ISO-8859-1.
 
Das ist schonmal ein guter Hinweis, danke! Ich tippe auch mal schwer auf UTF-8.
Kann ich das gespeicherte Byte-Array einfach nehmen und an einen weiteren Server schicken? Oder muss dazu extra wieder ein neuer Header etc. (kenn mich in dem Bereich nicht so aus) erstellt werden. Geht, wie gesagt, nicht um das manipulieren der Daten. Lediglich eine Verteilung.

Vielen Dank!
 
Normalerweise ist ja der Ablauf so, dass die Anfrage definitiv erst mal an den Cache Server geschickt wird und bei negativer Antwort an den DB Server geleitet wird.
Der Server muss also die Anfrage vom Client komplett empfangen und dann seinerseits als Client agieren und den Cache Server anfragen. Dann muss die Antwort ausgewertet werden und bei Bedarf die gleiche Anfrage nochmal an die DB gestellt werden. Eine korrekte Antwort muss dann als Antwort an den ursprünglichen Client gegeben werden.
Ich vermute allerdings, dass du nicht genau weißt, wie der Client agiert und welches Protokoll gesprochen wird?
Wenn das ein proprietäres Nachrichtenprotokoll ist, hast du keine Chance, die Antwort vom Cache Server auszuwerten.
 
Könntest die Nachricht 1:1 von Cache an Datenbank weiterleiten.
Dass mit den TCP Headern (Von/AN etc.) macht die TCPClient klasse von allein.

Vorrausgenommen du musst in der "myCompleteMessage" nichts editieren.
 
Danke für die vielen Tipps. Werde morgen früh gleich mal weiter probieren.
Der Client (eine Webanwendung) kommuniziert mittels JDBC. Ich will grundlegend zwischen selects und anderen SQL´s unterscheiden. Daher muss ich die Nachricht nicht verändern, aber durchaus lesen. Selects können zum Cache. Inserts/Updates/Deletes etc. sollen direkt zur Datenbank (deswegen eine Art "Verteiler").
Würde mich morgen nochmal melden, ob mich das Encoding schon weiterbringt.

Schönen Abend!
 
Zurück
Oben