Autor Beitrag
master147
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Sa 07.06.14 15:31 
Hallo,

ich bin gerade dabei einem Client kontinuierlich Daten zu schicken. Das ganze soll wie folgt aussehen.
Ein Client x sendet an meine Serverapplikation einen String. Der Server schreibt diesen String in ein Array und sendet an einen Client y einen Teil des Strings.

String Client x: Hallo Welt.
Teilstrich für Client y: Welt.

Mein Problem ist, dass ich dem CLient ja nur ein Mal einen String übermitteln kann. Dann wird die Verbindung abgebrochen. Kann ich das in einer While-Schleife lösen, dass der CLient immer bei einer Änderung auf dem server informiert wird ?

Vielen Dank für eure Hilfe!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3951
Erhaltene Danke: 812

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Sa 07.06.14 18:25 
Hallo,

ich muß leider sagen (bzw. schreiben), daß ich deine Beschreibung etwas unverständlich finde.
Denn natürlich kann man kontinuierlich eine Verbindung zu einem Rechner halten (sonst würde das Internet wohl kaum funktionieren ;-)).

Welche Technologie setzt du denn ein? Und evtl. wäre auch etwas Code hilfreich.
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Sa 07.06.14 18:47 
Danke für den Tipp.

Also mein Ziel ist es, dass mein Server sich mit einem Client x via TCP unterhält. Der Server speichert in diesem Fall einen Fortschritt und die Mac-Adresse von einem Client y und soll diesen Fortschritt ebenfalls via TCP an den Client x senden.

Hier mal der Quellcode:
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:
          //split message into Array
          if (clientmessage.StartsWith("=pg"))
          {
               //Replace the "=pg"
               clientmessage = clientmessage.Replace("=pg.""");
               //split string to Array
               commands = clientmessage.Split('.');
               keyword = commands[0];
             
               for (int i = 0; i < Liste.GetLength(0); i++)
               {
                   //check if we found the Mac-Adress from the Client
                   Position = Position + 1;

                   if (keyword == Liste[Position - 10])
                   {
                       //Now set the new progress and send it to the client
                       Liste[Position - 10] = commands[0];
                       Liste[Position - 11] = commands[1];
                       Zahl = Zahl + 1;
                       found = true;
                       pg = commands[1];
                       Byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(pg);
                       clientStream.Write(sendBytes, 0, sendBytes.Length);
                       break;
                   }
               }

               if (found == false)
               {
                  //Create a new entry with the Mac-Adress an the progress and send it to the client.
                  Liste[Zahl, 0] = commands[0];
                  Liste[Zahl, 1] = commands[1];
                  found = false;
                  Position = 0;
                  pg = commands[1];
                  Byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(pg);
                  clientStream.Write(sendBytes, 0, sendBytes.Length);
               }
          }

Im Moment kann ich nur einmal dem Client den Fortschritt senden. Ich möchte aber, dass bei einem neuen Fortschritt der Client wieder benachrichtigt wird.
Wenn der Fortschritt also 35% beträgt soll eine Nachricht an den Client gehen. Erst dann, wenn ein neuer Fortschritt für den Client bereit steht (z.B. 45%), dann soll der Client wieder benachrichtigt werden.

Moderiert von user profile iconTh69: Codeformatierung überarbeitet.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3951
Erhaltene Danke: 812

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Sa 07.06.14 19:06 
Das hat nichts mit der Verbindung zu tun, sondern mit der Logik deines Codes.

Ich vermute, daß beim zweiten Mal nicht mehr
ausblenden C#-Quelltext
1:
if (keyword == Liste[Position - 10])					

triggert, weil du die Variable Position nur im Negativfall wieder auf 0 zurücksetzt.

Aber warum benutzt du nicht gleich deine Schleifenlaufvariable:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for (int i = 0; i < Liste.GetLength(0); i++)
{
    //check if we found the Mac-Adress from the Client
    if (keyword == Liste[i, 0])
    {
        // ...
    }
}


Kennst du dich denn noch nicht mit dem Debugger aus? Damit kannst du den Programmcode schrittweise Zeile für Zeile durchlaufen, s z.B. [Artikel] Debugger: Wie verwende ich den von Visual Studio?
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Sa 07.06.14 19:53 
Danke für die Hinweise.

Nein, auch beim zweiten Mal triggert if (keyword == Liste[Position - 10]), da ich am Ende der Prozedur die Variable Prozedur auf 0 setze.

Stimmt, du hat Recht, dass werde ich mal ändern.

Doch, ich arbeite viel mit dem Debugger. Allerdings bringt der mich in dem Fall nicht weiter. Wenn mein Client zum zweiten Mal meinem Server den Fortschritt übergibt, kommt das Problem, dass der Debugger mir zwar zeigt, dass der Fortschritt gesendet wird. Der kommt aber nie beim Client an. Daraufhin hatte ich den Client geprüft, ob dort ein Problem liegt. Aber das ist dort nicht der Fall.
Es muss irgendwie an meinem Sende-Code liegen. Nur beim ersten Mal sendet der Server den Fortschritt richtig an den Client. Danach kommt beim Client leider nie was an, obwohl das der Debugger zeigt, das der Server sendet und auch keine Probleme meldet.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3951
Erhaltene Danke: 812

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Sa 07.06.14 20:39 
Ok, das mit der Variablen konnte ich aus deinem Code ja nicht heraussehen.

Aber wenn der Sende-Code wirklich ausgeführt wird (und es keine Exception gibt, die du irgendwo fängst), dann kann es eigentlich nur am Empfangscode liegen.
Du könntest auch mal mit Wireshark überprüfen, ob wirklich was gesendet wird.
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Sa 07.06.14 20:51 
Ja, dass stimmt, den Teil vom Code hatte ich nicht gepostet.

Nein, leider wird keine Exception gebracht. Ich werde das morgen mal mit Wireshark prüfen. Vielleicht bekomme ich da noch was heraus.
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: So 08.06.14 15:48 
Ich habe heute mal mit Wireshark überprüft. Also der Client sendet nur beim ersten Mal. Beim zweiten Mal kommt im Debugger eine Exception, dass clientStream.Write(sendBytes, 0, sendBytes.Length); eine nicht unterstütze Exception verursacht hat. Der Fehler tritt bei Clientstream.Length als auch bei Clientstream.Position .

Ich hänge mein Projekt in den Anhang.
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3951
Erhaltene Danke: 812

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: So 08.06.14 17:37 
Bei Exceptions solltest du immer in der MSDN nachlesen: NetworkStream.Length
MSDN hat folgendes geschrieben:
Gibt die Länge der im Stream verfügbaren Daten an. Diese Eigenschaft wird gegenwärtig nicht unterstützt und löst immer eine NotSupportedException aus.

;-)
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: So 08.06.14 17:46 
Okay. Aber was müsste ich denn dann benutzen, um meine Daten zu senden?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3951
Erhaltene Danke: 812

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: So 08.06.14 19:05 
Wie sieht denn der Client Sende-Code aus?
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: So 08.06.14 19:25 
Der Sende-Code des Clients sieht folgendermaßen aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
 

Socket Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    Socket.Connect(IP, 900);                                                            //Client IP
                    Socket.Send(System.Text.Encoding.UTF8.GetBytes(TextBox1.Text));


In der Textbox steht dann die Nachricht drin, die gesendet werden soll.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3951
Erhaltene Danke: 812

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mo 09.06.14 07:49 
Benutze mal als Port einen über 1023 anstatt 900, da dies einer der Standardisierten Ports ist (wenn auch evtl. z.Z. nicht belegt) - evtl. blockiert der Router diese.

Und erzeugst du im Client den Socket immer wieder neu? Dann gibt es dort auch evtl. eine Exception (weil der Port schon belegt ist) bzw. beim Server müßte der Client sich immer wieder neu verbinden ('connecten').
Benutze hierfür eine Membervariable, die du nur beim Start des Programms initialisierst.
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mo 09.06.14 09:34 
Okay, Ich habe jetzt den Port 7000 gewählt.

Der Socket wird nur einmal beim Start des Programms initialisiert. Das senden des Clients zum Server habe ich gerade noch mal mit Wireshark überprüft. Das klappt wunderbar.
Nur das senden vom Server zum Client funktioniert nicht.