Entwickler-Ecke
Internet / Netzwerk - [Socket] ohne Recieve.Text entwas empfangen
supersass1 - Di 27.11.07 16:04
Titel: [Socket] ohne Recieve.Text entwas empfangen
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 - 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.
supersass1 - 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 - 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?
supersass1 - 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 - Di 27.11.07 17:57
Titel: Re: [Socket] ohne Recieve.Text entwas empfangen
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. :idea: 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 [
http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html] (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
noidic - 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?
Narses - Di 27.11.07 18:05
Titel: Re: [Socket] ohne Recieve.Text entwas empfangen
Moin!
supersass1 hat folgendes geschrieben: |
Delphi-Quelltext 1:
| Socket.SendText('TEXT'); | |
Das sieht doch sehr nach den Delphi-Sockets (ScktComp) aus. ;)
cu
Narses
supersass1 - Di 27.11.07 20:29
Titel: Re: [Socket] ohne Recieve.Text entwas empfangen
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. :idea: So weißt du, bevor das "OK" nicht da ist, muss er noch beschäftigt sein. ;) |
Doch wie mach ich das?
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 - Di 27.11.07 20:44
Titel: Re: [Socket] ohne Recieve.Text entwas empfangen
Moin!
supersass1 hat folgendes geschrieben: |
| Doch wie mach ich das? |
Hier gibt es ein Tutorial [
http://www.delphi-library.de/topic_54269.html] (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. :nixweiss: :|
cu
Narses
opactium - 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 - 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. :idea:
Hier ist ein Tutorial dazu [
http://www.delphi-library.de/topic_54269.html]. ;)
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 [
http://www.delphi-library.de/topic_56194.html]. :les: ;)
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!