| Autor |
Beitrag |
supersass1
      
Beiträge: 55
|
Verfasst: Di 27.11.07 16:04
hallo zusammen,
ich habe eine Host.exe und seine Sender.exe.
Die Host.exe empfängt immer Text.
Kommt ein bestimmter Text, so wird etwas ausgeführt.
Die Sender.exe sendet mittels der Funktion
Delphi-Quelltext 1:
| Socket.SendText('TEXT'); |
Bekommt der Host eine bestimmte NAchricht, so führt er etwas aus, dies dauert natürlich dementsprechend.
Doch kann man dem Sender einen Wert zurückgeben, dass er weiß, dass der Host gerade "beschäftigt" ist, ohne mit Send. und Recieve.Text zu arbeiten?
Mein Problem ist, dass ich ein Host habe, und 2 (oder mehrmals) sein Sender, aber der eine muss ja jeweils warten, bis der andere fertig ist, doch wie programmier ich das?
Letztendlich möchte ich die Lösung nicht so machen, dass der Sender auch mit Recieve.Text arbeitet, da ich dann ja quasi den Sender auch zum Host umgestalte (und im Internet Ports freischalten müsse, und das kann ich nicht jedem User zumuten) Chatten kann man schließlich auch ohne Portfreigaben.
mfg supersass1
P.S.: Es handelt sich dabei um ein Host programm, dass bei mir auf dem Rechner liegt, mit dem ich meinen Usern ermöglichen möchte, bestimmte Sachen zu hosten.
P.s.s:
Gibt die oben genannten Funktion vielleicht einen Rückgabewert, falls der Host nicht erreicht werden kann, oder gibt es eine Funktion, die dies abfragen kann?
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Di 27.11.07 16:10
Frage: Warum müssen die Sender aufeinander warten? Lass doch parallele Verbindungen zu.
Außerdem musst du keinen Port freigeben, wenn du mit ReceiveText arbeitest, du gehst ja über den sleben Socket wie in die andere Richtung.
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
supersass1 
      
Beiträge: 55
|
Verfasst: Di 27.11.07 16:13
noidic hat folgendes geschrieben: | | Frage: Warum müssen die Sender aufeinander warten? Lass doch parallele Verbindungen zu. |
Ja das geht ja nicht, da eine Verbindung ja etwas am Host PC macht, meinetwegen ein Blobby-Game öffnen, und das dauert ja, bis dies fertig ist (einige minuten).
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Di 27.11.07 16:31
Macht doch nix, während der Server in einem Thread rödelt, kann er doch andere Anfragen beantworten, wo ist das Problem?
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
supersass1 
      
Beiträge: 55
|
Verfasst: Di 27.11.07 16:35
ich versteh dich nur theoretisch, wie soll ich das umsetzen?
bei mir sieht das momentan ungefähr wie folgt aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (recieve.text = '1') then begin end else if (recieve.text = '2') then begin end; |
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 27.11.07 17:57
Moin!
supersass1 hat folgendes geschrieben: | Bekommt der Host eine bestimmte NAchricht, so führt er etwas aus, dies dauert natürlich dementsprechend.
Doch kann man dem Sender einen Wert zurückgeben, dass er weiß, dass der Host gerade "beschäftigt" ist, ohne mit Send. und Recieve.Text zu arbeiten? |
Das ist eine Aufgabe, die dein Protokoll regeln muss oder sollte. Wenn du einen Befehl ausführst, dann lass doch einfach den Empfänger ein "OK" senden, wenn er mit der Ausführung fertig ist.  So weißt du, bevor das "OK" nicht da ist, muss er noch beschäftigt sein.
supersass1 hat folgendes geschrieben: | bei mir sieht das momentan ungefähr wie folgt aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (recieve.text = '1') then begin end else if (recieve.text = '2') then begin end; | |
Wenn ich mir den Code ansehe, dann "befürchte" ich mal, du trennst Datenpakete mit Hilfe der Ereignisse (oder noch schlimmer, wenn man unterstellt, dass recieve ein Socket-Objekt ist, dann liest du bei jedem Vergleich aus dem Socket und wirfst dabei die Daten weg). Das wird sehr wahrscheinlich nicht funktionieren.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Di 27.11.07 18:03
Ich vermute mal, dass du dich bisher nicht mit Threads beschäftigt hast. Wenn du dich mit Netzwerkprogrammierung beschäftigen möchtest, solltest du das ändern
Zu dem Thema gibts haufenweise Tutorials im Netz und hier findet sich bestimmt auch so einiges zum Thema Threads.
Welche Socket-Komponente benutzt du eigentlich? Indy oder was anderes?
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 27.11.07 18:05
Moin!
supersass1 hat folgendes geschrieben: | Delphi-Quelltext 1:
| Socket.SendText('TEXT'); | |
Das sieht doch sehr nach den Delphi-Sockets (ScktComp) aus.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
supersass1 
      
Beiträge: 55
|
Verfasst: Di 27.11.07 20:29
Narses hat folgendes geschrieben: | Moin!
supersass1 hat folgendes geschrieben: | Bekommt der Host eine bestimmte NAchricht, so führt er etwas aus, dies dauert natürlich dementsprechend.
Doch kann man dem Sender einen Wert zurückgeben, dass er weiß, dass der Host gerade "beschäftigt" ist, ohne mit Send. und Recieve.Text zu arbeiten? | Das ist eine Aufgabe, die dein Protokoll regeln muss oder sollte. Wenn du einen Befehl ausführst, dann lass doch einfach den Empfänger ein "OK" senden, wenn er mit der Ausführung fertig ist. So weißt du, bevor das "OK" nicht da ist, muss er noch beschäftigt sein.  |
Doch wie mach ich das?
| Zitat: |
supersass1 hat folgendes geschrieben: | bei mir sieht das momentan ungefähr wie folgt aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (recieve.text = '1') then begin end else if (recieve.text = '2') then begin end; | | Wenn ich mir den Code ansehe, dann "befürchte" ich mal, du trennst Datenpakete mit Hilfe der Ereignisse (oder noch schlimmer, wenn man unterstellt, dass recieve ein Socket-Objekt ist, dann liest du bei jedem Vergleich aus dem Socket und wirfst dabei die Daten weg). Das wird sehr wahrscheinlich nicht funktionieren.
cu
Narses |
ich hatte vergessen nochetwas mitzuposten, der Code sieht in etwa so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var k:integer; begin if (Socket.ReceiveText = '1') then begin |
Somit fragt er ja immer ab, wann der Text = 1 ist.
Sobald er 1 ist, führt er das halt aus.
Bei 2 führt er etwas anderes aus.
Narses hat folgendes geschrieben: | Moin!
supersass1 hat folgendes geschrieben: | Delphi-Quelltext 1:
| Socket.SendText('TEXT'); | | Das sieht doch sehr nach den Delphi-Sockets (ScktComp) aus.
cu
Narses |
Ich benutze die Komponente, die unter dem Register "internet" zu finden ist.
TClientSocket und TServerSocket.
Ich arbeite mit Delphi 5, ich weiß alte Version, aber mit der arbeiten wir in der Schule auch.
mfg supersass1
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 27.11.07 20:44
Moin!
supersass1 hat folgendes geschrieben: | | Doch wie mach ich das? | Hier gibt es ein Tutorial (eigentlich schon mehrere) dazu.
supersass1 hat folgendes geschrieben: | ich hatte vergessen nochetwas mitzuposten, der Code sieht in etwa so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var k:integer; begin if (Socket.ReceiveText = '1') then begin | Somit fragt er ja immer ab, wann der Text = 1 ist.
Sobald er 1 ist, führt er das halt aus.
Bei 2 führt er etwas anderes aus. |
Leider ist es genau so, wie ich es schon vermutet hatte, er wird wohl nie das ausführen, was bei "2" passieren soll, weil du die gelesenen Daten im ersten Vergleich schon verwirfst, wenn es nicht "1" ist.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
opactium
      
Beiträge: 20
|
Verfasst: Do 13.12.07 13:54
mach dich einfach trennzeichen in den zu sendenden string rein. also so:
Delphi-Quelltext 1:
| TServerSocket.Socket.SendText('showmessage#' + edit1.text + '#'); |
und beim client:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| command := split(TClientSocket.Socket.ReceiveText, '#'); if split[0] = 'showmessage' then showmessage(split[1]); if split[0] = 'was anderes' then tu was anderes mit split[1]; usw. |
prinzip verstanden? die split funktion kriegst du ausm inet...
so mache ich das immer, und hatte bis jetzt noch keine probleme damit.
MfG
ach ja:
wie schon gesagt wurde, muss nur der Client, also der der die showmessage empfaengt den port öffnen. der server kann dann ohne port oeffnen senden und empfangen.
das mit dem showmessage war nur ein beispiel, wie du auswerten kannst, was fuer ein string reinkommt.
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.12.07 14:29
Moin!
opactium hat folgendes geschrieben: | mach dich einfach trennzeichen in den zu sendenden string rein. also so:
Delphi-Quelltext 1:
| TServerSocket.Socket.SendText('showmessage#' + edit1.text + '#'); | |
Ich empfehle ein Zeichen zu nehmen, das in "normalem" Text nicht vorkommt, wie z.B. #13; die Raute ist nicht so gut geeignet.
Aber abgesehen davon kannst du mit dem Serversocket selbst nicht senden, sondern nur mit den Client-Verbindungen aus dem .Connections[]-Array. Hier ist ein Tutorial dazu.
opactium hat folgendes geschrieben: | und beim client:
[...]
so mache ich das immer, und hatte bis jetzt noch keine probleme damit. |
Wenn du keinen Empfangspuffer verwendest, dann würde ich sagen, dass dein Code leider doch ein Problem kriegen wird, wenn die Datenrate hoch genug ist. Hier ist ein FAQ-Beitrag dazu.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|