Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 21.10.16 18:33 
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 :)

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 955
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Fr 21.10.16 19:50 
Guten Abend Csharp-programmierer,

vielleicht wäre hier die Anwendung von TCP/UDP besser geeignet. Mehrere Clients können dabei in Echtzeit miteinander und/oder mit dem Server Nachrichten austauschen.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 21.10.16 19: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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 955
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Fr 21.10.16 20:15 
Für mich wäre eine Datenbank einzig dafür da, um Informationen zu hinterlegen und zur gegebenen Zeit wieder aufzurufen.
Wenn ich eine Art Kommunikation zwischen mehreren Personen bereitstellen möchte, dann werde ich den Gesprächsverlauf nicht ständig an die Datenbank senden und diesen wieder von der Datenbank aufrufen.
Das wäre im Prinzip so etwas, wenn ich deine Beschreibung richtig verstanden habe.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 21.10.16 20: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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 955
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Fr 21.10.16 20:36 
Es gibt festgelegte Ports die für bestimmte Zwecke und von bestimmten Anwendungen genutzen werden, und jene, die einem "frei" zur Verfügung stehen. Ich kenn' die Werte nicht auswendig, da wirst du dich selber schlau machen müssen.
Der Chatverlauf schwebt nicht irgendwo herum. Er wird zumindest von einem eingerichteten TCP Server aufgenommen und kann von diesen wieder irgendwohin exportiert/gespeichert werden.
Der Speichervorgang kann nach belieben, in einem bestimmten Intervall erfolgen, oder nach einer Sitzung. Der Inhalt kann meinetwegen in eine Datenbank ausgelagert werden, oder in einer einfachen Textdatei.
Und der Autausch von Nachrichten bleibt somit uptodate, also brauchst du schonmal keine 5sekündigen Anfragen schicken, ob es etwas neues gibt oder nicht.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 21.10.16 21:39 
Ich habe jetzt mal im Internetz gesucht und habe diesen Code zusammengestellt:

TCP Client
ausblenden volle Höhe 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
ausblenden volle Höhe 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...

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 955
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Fr 21.10.16 22:55 
Mit der IP Adresse wirst du wenig Erfolg haben. Es muss schon eine IP sein, die auch wirklich über's Internet läuft, wie z.B. die des gemieteten Web Servers. Server und Client Anwendung müssen dabei die selbe IP und Port beziehen. Dann stellst du die TCP Server Anwendung auf den Web Server, führst die Anwendung aus, lässt sie offen, führst den Connect aus, startest anschließend die Client Anwendung von deinen PC aus, und schaust was passiert. ;)

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 22.10.16 09: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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 955
Erhaltene Danke: 126

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE
BeitragVerfasst: Sa 22.10.16 23:54 
Per Remote wirst du darauf zugreifen können, siehe hier.
Dass du so unvorbereitet an die Sache herangehst, ist ein wenig unschön.

_________________
„Nicht für das Leben, sondern für die Schule lernen wir.“ „Kürze die lange Rede, damit sie nicht verdächtig wirke!“
(Lucius Annaeus Seneca : 1 - 65 n. Chr)
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: So 23.10.16 12: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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 23.10.16 12: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: So 23.10.16 18: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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 23.10.16 19: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: So 23.10.16 19: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:(

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 23.10.16 19:51 
Dann die unsichere Variante mit http. Sicher ist nur mit SSL. Egal über welches Transportprotokoll.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mo 24.10.16 15:38 
Okay. Wie muss ich jetzt vorgehen? Die Anwendung von dem Server über PHP Starten oder wie? Das habe ich nicht ganz verstanden :(

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 24.10.16 16:20 
Nein du sollst das was der Server machen soll in PHP implementieren.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 650
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 25.10.16 13:29 
Ich habe mal ein wenig gegoogelt. Brauche ich dann sowas?

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

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3941
Erhaltene Danke: 728


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 25.10.16 13: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?