Entwickler-Ecke

Basistechnologien - Neue Nachrichten darstellen


Csharp-programmierer - Fr 21.10.16 19:33
Titel: Neue Nachrichten darstellen
Hallo Forum:

Zu meinem Problem: Auf einem SQL Datenbankserver habe ich eine Tabelle Nachrichten angelegt. Wenn man eine Nachricht versendet, dann wird der doppelte Datensatz eingetragen. Das hat den Sinn, dass die beiden Benutzer unterschiedlich die Nachrichten editieren können. Jetzt möchte ich, dass die C# Anwendung in einem bestimmten Zeitraum untersucht, ob es neue Nachrichten gibt und wenn ja, dann soll der Benutzer automatisch darauf hingewiesen werden.

Ich habe schonmal einen kleinen Lösungsansatz dazu. Das Programm überprüft die Datenbank auf neue Nachrichten und die neuen Nachrichten werden gezählt. Auf der Form befindet sich eine Hauptvariable (vom Typ INT). Wenn die Methode aufgerufen wird, wird eine zweite Variable für nur diese Methode angelegt und über eine foreach Schleife (jede ungelesene Nachricht) gefüllt. Wenn die Zahl jetzt größer ist als die Hauptvariable, soll eine Nachricht angezeigt werden und demnach wird dann die Hauptvariable mit der Methodenvariable gleich gestellt.

Soweit zur Theorie. Habt Ihr eventuell andere, bessere oder effizientere Lösungsvorschläge?

Mit freundlichen Grüßen :)


Delete - Fr 21.10.16 20:50

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Fr 21.10.16 20:59

Wenn ich ehrlich bin, habe ich auch erst daran gedacht.

Aber wir wollen ja unser Netzwerk nicht nur auf dem PC rausbringen. Wir haben beispielsweise auch schon eine App in Entwicklung gegeben, die unser Netzwerk wieder spiegelt. Und das ganze auch noch auf einer Website. Und da würde sich - meiner Meinung nach - ein SQL Datenbankserver mehr empfehlen, da so wirklich alle Daten - egal auf welchen Geräten - wirklich synchron laufen.

In einer TCP Anwendung habe ich mal gehört, dass man da verschiedene Ports öffnen muss und (oder) die Kommunikation in einem Netzwerk nur stattfindet.

Aber ich habe ja schon mit meinem "Geschäftspartner" über unser Netzwerk fließend kommuniziert. Es hat alles prima funktioniert, bis auf die automatische Nachrichtenüberprüfung, also ob es neue, ungelesene Nachrichten gibt. Oder wo siehst du die Nachteile eines SQL Datenbankservers?


Delete - Fr 21.10.16 21:15

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Fr 21.10.16 21:21

Naja. Man könnte den User ja freistellen, welchen Dienst er benutzen möchte.
Aber stimmt es, dass man TCP Programme nur in einem Netzwerk benutzen kann / verschiedene Ports öffnen muss? Und der Chatverlauf ist ja dann nur so lange verfügbar, wie die Benutzer online sind, sprich wenn einer rausgeht, ist der Verlauf weg, oder?


Delete - Fr 21.10.16 21:36

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Fr 21.10.16 22:39

Ich habe jetzt mal im Internetz gesucht und habe diesen Code zusammengestellt:

TCP Client

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
namespace TCP_Client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                TcpClient client = new TcpClient("127.0.0.1"8080);
                StreamReader reader = new StreamReader(client.GetStream());
                StreamWriter writer = new StreamWriter(client.GetStream());
                string s = string.Empty;

                while(!s.Equals("Exit"))
                {
                    Console.Write("Enter a string to send to the server...");
                    s = Console.ReadLine();
                    Console.WriteLine();
                    writer.WriteLine(s);
                    writer.Flush();
                    string server_string = reader.ReadLine();
                    Console.WriteLine(server_string);
                }

                reader.Close();
                writer.Close();
                client.Close();
            }
            catch(Exception ex)
            {
                Console.Write(ex.Message);
            }
            finally
            {

            }
        }
    }
}


TCP Server

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
namespace TCP_Server
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = null;
            try
            {
                listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080);
                listener.Start();
                Console.WriteLine("MultiThreadEchoServer start...");

                while(true)
                {
                    Console.WriteLine("Waiting for connection...");
                    TcpClient client = listener.AcceptTcpClient();
                    Console.WriteLine("Accepted new client connection...");
                    Thread t = new Thread(ProcessClientRequest);
                    t.Start(client);

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (listener != null)
                    listener.Stop();
            }
        }
        private static void ProcessClientRequest(object argument)
        {
            TcpClient client = (TcpClient)argument;
            try
            {
                StreamReader reader = new StreamReader(client.GetStream());
                StreamWriter writer = new StreamWriter(client.GetStream());
                string s = string.Empty;

                while(!(s = reader.ReadLine()).Equals("Exist") || (s == null))
                {
                    Console.WriteLine("From client -> " + s);
                    writer.WriteLine("From Server -> " + s);
                    writer.Flush();
                }

                reader.Close();
                writer.Close();
                client.Close();
                Console.WriteLine("Closing client connection");
            }
            catch (IOException ex)
            {
                Console.WriteLine("Problem with client connection. Thread exists");
            }
            finally
            {
                if(client != null)
                {
                    client.Close();
                }
            }
        }
    }
}


Genau so wie der es im Video gemacht hat, funktioniert es jetzt auch. Wie läuft das jetzt mit dem Server? Kann ich den jetzt beispielsweise auf meinem PC starten, dazu einen TCP Client und mein "Geschäftspartner" aus Berlin öffnet dann auch den WebClient? Würde das dann funktionieren? Weil das läuft ja dann 100 %ig über verschiedene Netzwerke...


Delete - Fr 21.10.16 23:55

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Sa 22.10.16 10:42

Stimmt. Jetzt sehe ich es auch.

Zitat:
Dann stellst du die TCP Server Anwendung auf den Web Server, führst die Anwendung aus, lässt sie offen,
wie führe ich das Programm auf dem Webhosting Server aus? Kann man das bei meinem überhaupt? Und wäre es nicht unsicher, die IP mit in dem Quellcode zu legen?


Delete - So 23.10.16 00:54

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - So 23.10.16 13:38

Das Problem aber ist, dass ich keinen vServer gemietet habe. Ich habe einen WebHosting Server gemietet. Der Support meinte, dass man keine Programme auf einem WebHosting Server starrten kann. :(

Gibt es einen anderen Weg, ohne SQL Datenbankserver zu Kommunizieren?


Ralf Jansen - So 23.10.16 13:50

Zitat:
Der Support meinte, dass man keine Programme auf einem WebHosting Server starrten kann.


Natürlich geht das. Das ~Programm~ muss aber halt vom WebHost gehostet werden können also in der passenden Sprache geschrieben sein und über den für diesen Server offenen Kanal erreichbar sein.
Aus deinen anderen Thread schließe ich mal das die Antwort Https und PHP heißt.

Zitat:
Gibt es einen anderen Weg, ohne SQL Datenbankserver zu Kommunizieren?


Wiederum mit der Kenntnis aus deinen anderen Thread, du hast es bereits getan. Warum sollte es jetzt also nicht mehr gehen? Setze einfach die gleichen Mittel ein.


Csharp-programmierer - So 23.10.16 19:52

Zitat:
Natürlich geht das. Das ~Programm~ muss aber halt vom WebHost gehostet werden können also in der passenden Sprache geschrieben sein und über den für diesen Server offenen Kanal erreichbar sein.
Aus deinen anderen Thread schließe ich mal das die Antwort Https und PHP heißt.


Was heißt das jetzt? Kann PHP das Programm ausführen? Oder wie kann ich mir das vorstellen?

Zitat:
Wiederum mit der Kenntnis aus deinen anderen Thread, du hast es bereits getan. Warum sollte es jetzt also nicht mehr gehen? Setze einfach die gleichen Mittel ein.


Ist das jetzt auf den SQL Server bezogen?
Wenn ja: Eigentlich sehe ich das auch so, dass eine Datenbank dafür geeignet ist, große Mengen an Daten zu speichern und diese dann rauszugeben. Aber ich weiß nicht, ob es gut ist, wenn viele PC's in einer bestimmten Zeitspanne, Serveranfragen schicken und der Datenbankserver so nie zur Ruhe kommt. Oder denke ich da falsch?

Aber meiner Meinung nach finde ich TCP dafür geeigneter?


Ralf Jansen - So 23.10.16 20:32

Zitat:
Kann PHP das Programm ausführen?


Mit PHP kannst du etwas schreiben das näherungsweise das gleiche wie der gezeigte Code tut. Ich würde das ein Programm nennen.

Zitat:
Aber meiner Meinung nach finde ich TCP dafür geeigneter?


Du vergleichst ein Speichersystem (Datenbank) mit einen Kommunikationsprotokoll (TCP). Was kann man da sinnvoll miteinander vergleichen?

Wenn du 2 Systeme kommunizieren lassen willst brauchst du ein Protokoll. Z.B. TCP. Wenn du die Kommunikation zwischen diesen beiden dauerhaft irgendwo ablegen willst dann brauchst du etwas zum Speichern zum Beispiel eine Datenbank. Das Datenbanken oft auch eine Kommunikationsmethodik mitbringen damit man über ein Netz auf sie zugreifen kann sollte man nicht mit einem richtigen Protokoll verwechseln. Die Protokolle von Datenbankservern sind fast ausnahmslos denkbar ungeeignet um sie außerhalb eines lokalen Netzes zu verwenden. Sie haussieren mit der Port Nutzung sind nicht wirklich gesichert oder haben sonstige Probleme. Wenn du an ein Client-Server Model für deine Anwendung denkst (eine Anwendung spricht direkt mit einem DB Server über ein Netz) dann nur wenn du damit niemals über das Internet kommunizieren willst sondern nur wenn du in einem lokalen Netz bleibst. Da du von einem Webhoster sprichst ist also die direkte Kommunikation mit der Datenbank dort keine vernünftige Option. Und wenn du sicher durchs Internet willst ist TCP selbst auch kaum eine sichere Option. Die natürliche und sichere Wahl wäre Https. Sobald du weißt wie man es optimaler als mit Https macht, also einen sicheren Kanal aufbaut der deine User auch nicht mit Firewalleinstellorgien quält kannst du dieses Fass aufmachen. Da bist du aber eher noch nicht.


Csharp-programmierer - So 23.10.16 20:46

Ich habe auch schonmal über HTTPS nachgedacht, aber da wir nicht nichts verdienen, ist das noch zu teuer. Hört sich zwar Professionell an, aber 2 Euro um Monat plus SSL Zertifikat ist noch zu teuer:(


Ralf Jansen - So 23.10.16 20:51

Dann die unsichere Variante mit http. Sicher ist nur mit SSL. Egal über welches Transportprotokoll.


Csharp-programmierer - Mo 24.10.16 16:38

Okay. Wie muss ich jetzt vorgehen? Die Anwendung von dem Server über PHP Starten oder wie? Das habe ich nicht ganz verstanden :(


Ralf Jansen - Mo 24.10.16 17:20

Nein du sollst das was der Server machen soll in PHP implementieren.


Csharp-programmierer - Di 25.10.16 14:29

Ich habe mal ein wenig gegoogelt. Brauche ich dann sowas?

http://php.net/manual/de/sockets.examples.php


Ralf Jansen - Di 25.10.16 14:35

Warum nimmst du nicht einfach http? Das kann dein Webserver. Es ist auch aufbauend auf tcp. Üblicherweise läßt jede Firewall http Verkehr durch. Warum willst du dir unbedingt ein Problem ans bein Nageln in dem du was anderes machst?


Csharp-programmierer - Di 25.10.16 14:47

Hä? Ich verstehe jetzt gerade gar nicht, was ich machen soll. Meintest du nicht, ich solle die C# Applikation in PHP implimentieren? Oder soll ich bei der SQL Datenbank bleiben?


Ralf Jansen - Di 25.10.16 15:19

Zitat:
Meintest du nicht, ich solle die C# Applikation in PHP implimentieren?


Nein. Zumindest nicht genau. Ich bin der Meinung du solltest dein Problem mit den Mitteln lösen die du hast.Solange nicht feststeht das diese Mittel nicht ausreichen.
Weder brauchst du dazu also c# oder direkt tcp. Was ich weiß bzw. glaube über dein Problem zu wissen

a.) Du willst eine Kommunikations zwischen 2 PCs/Personen implementieren und die in einer Datenbank ablegen.
b.) Du scheinst einen Webserver gemietet zu haben (die üblicherweise schon eine Datenbank installiert haben)
c.) Der Webserver scheint ein Modell zu sein der PHP spricht
d.) Webserver sprechen üblicherweise http(s) mit externen System.

Daraus folgt das es das Sinnvollste ist das dein Server die Sache in php implementiert mit der Außenwelt dann über http kommuniziert. Die Clientseite ist dann offen. Da kannst du dann gerne C# nehmen.


Csharp-programmierer - Di 25.10.16 17:58

Sorry, ich stehe gerade auf dem Schlauch. Geht das dann mit der SQL Datenbank so in Ordnung, oder kann sie kaputt gehen, wenn man andauernd darauf zugreift?


Ralf Jansen - Di 25.10.16 18:16

Nein. Wenn da was kaput geht ist das ein Bug. Nur zugreifen ist kein Problem.


Csharp-programmierer - Di 25.10.16 18:52

Okay. Dann werde ich das wahrscheinlich über die SQL Datenbanken regeln. Oder ist das so eine Methode, wo du sagst, dass das Problem zwar jetzt erstmal gelöst ist aber später dann die Probleme kommen?


Ralf Jansen - Di 25.10.16 19:05

Nein Probleme sehe ich da nicht außer du willst einen Team-chat für eine 4-stellige Anzahl gleichzeitig Beteiligter implementieren. Dann ist das Problem aber weniger ob eine Datanbank beteiligt ist oder nicht. Das wäre dann ein Problem wo du die gesamte Implementierung an allen Stellen optimieren müsstest. Die Kommunikation könntest du genauso ohne Datenbank machen indem du die Nachrichten nur im Speicher des Servers hältst. Die Nachrichten wäre dann aber halt flüchtig wenn sie einmal am Ziel sind würdest du die Nachricht ja wieder aus dem Speicher werfen. Die Datenbank ist nur gut um die Kommunikation zu loggen.