Autor Beitrag
supersass1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Di 27.11.07 16:13 
user profile iconnoidic 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if (recieve.text = '1'then
begin
//blablabla macht er sein ganzen kram mit tastatur und mausbefehle etc...
end
else if (recieve.text = '2'then
begin
// blablabla halt was anderes, zum beisepil eine mp3 abspielen
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 27.11.07 17:57 
Moin!

user profile iconsupersass1 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. ;)

user profile iconsupersass1 hat folgendes geschrieben:
bei mir sieht das momentan ungefähr wie folgt aus
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if (recieve.text = '1'then
begin
//blablabla macht er sein ganzen kram mit tastatur und mausbefehle etc...
end
else if (recieve.text = '2'then
begin
// blablabla halt was anderes, zum beisepil eine mp3 abspielen
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 27.11.07 18:05 
Moin!

user profile iconsupersass1 hat folgendes geschrieben:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Di 27.11.07 20:29 
user profile iconNarses hat folgendes geschrieben:
Moin!

user profile iconsupersass1 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?

Zitat:

user profile iconsupersass1 hat folgendes geschrieben:
bei mir sieht das momentan ungefähr wie folgt aus
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if (recieve.text = '1'then
begin
//blablabla macht er sein ganzen kram mit tastatur und mausbefehle etc...
end
else if (recieve.text = '2'then
begin
// blablabla halt was anderes, zum beisepil eine mp3 abspielen
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:
ausblenden 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
//blabla siehe oben - hier wird etwas getan


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.



user profile iconNarses hat folgendes geschrieben:
Moin!

user profile iconsupersass1 hat folgendes geschrieben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 27.11.07 20:44 
Moin!

user profile iconsupersass1 hat folgendes geschrieben:
Doch wie mach ich das?
Hier gibt es ein Tutorial (eigentlich schon mehrere) dazu. ;)

user profile iconsupersass1 hat folgendes geschrieben:
ich hatte vergessen nochetwas mitzuposten, der Code sieht in etwa so aus:
ausblenden 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
//blabla siehe oben - hier wird etwas getan
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

_________________
There are 10 types of people - those who understand binary and those who don´t.
opactium
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 13.12.07 13:54 
mach dich einfach trennzeichen in den zu sendenden string rein. also so:

ausblenden Delphi-Quelltext
1:
TServerSocket.Socket.SendText('showmessage#' + edit1.text + '#');					


und beim client:

ausblenden 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 user profile iconNarses: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.12.07 14:29 
Moin!

user profile iconopactium hat folgendes geschrieben:
mach dich einfach trennzeichen in den zu sendenden string rein. also so:
ausblenden 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. ;)

user profile iconopactium 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. :les: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.