| Autor |
Beitrag |
Softchaos67
      
Beiträge: 103
XP Prof
Delphi 7
|
Verfasst: Do 07.10.04 13:34
Hallo NG,
bisher hatte ich mit TCP usw noch nichts zu tun. Ich möchte eine Art Chat programmieren. Alle User die das Programm im Firmennetzerk starten sollen an dem Chat teilnehmen könne. Zu Anfang startet irgendjemand autom. einen Server, die anderen finden diesen Server und verbinden sich autom. damit. Falls der Server ausfällt übernimmt ein anderer client den Serverdienst. Ist sowas mit indy server und client Komponenten möglich?
Es soll nur eine EXE geben, eben mit client und server.
Gruss
Matthias
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 07.10.04 14:18
Das mit der Ausfallsicherheit ist nicht so einfach. Schau dir mal die Open-Source-Unit "SimpleNetworkGame" an, da habe ich mit dieser Unit auch ein Chatprogramm als Beispielanwendung gepostet.
Cu,
Udontknow
|
|
Softchaos67 
      
Beiträge: 103
XP Prof
Delphi 7
|
Verfasst: Do 07.10.04 14:26
@udontknow
ich kann da leider nix runterladen. Du meinst doch sicher von deiner HP (XNEBULA)?
Sag mir wie..
Gruss
Matthias
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 07.10.04 14:45
Nene, folge mal diesem Link hier:
www.delphi-forum.de/...tworkgame_28740.html
Cu,
Udontknow
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 07.10.04 15:25
Also ich habe erstklassige Erfahrungen mit der Unit SIMPLEUDP gemacht. Du arbeitest dann zwar auf UDP Basis, aber das macht imho bei nem kleinen Chat keine Unterschiede. Ich habe damit auch gerade einen Chat geschrieben, ist kinderleicht, damit Daten jeder Art zu senden.
Im Übrigen ist es ziemlich lustig, die Maus eines anderen Chat-Teilnehmers fernzusteuern. Wär auch n nettes Feature für dich ;=)
|
|
Softchaos67 
      
Beiträge: 103
XP Prof
Delphi 7
|
Verfasst: Do 07.10.04 15:56
@Elite
Danke, ich werds mir anschauen.
Das mit der Maus lass ich lieber, dass würde meine User etwas erschrecken 
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Di 12.10.04 15:20
Hehe@Elite
das mit der Maussteuerung musst du mir mal erklären. Wie geht das?  Klingt ganz lustig
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 12.10.04 15:46
schau dir mal die APIs GetCursorPos und SetCursorPos an!
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Di 12.10.04 20:37
Hm, ok werd ich machen.
Ich hab da aber auch so ein Problem. Ich mach auch grad einen Chat fürs Netzwerk und hatte das Problem das
ich(Server) nichts an meinen Bruder (client) schicken konnte, aber er konnte mir nachtichten schicken. Wie kann
ich das denn jetzt machen, dass der Server auch nachrichten an die clienten schicken kann?
Ich hab das so gemacht, wenn man als server auf den Senden button klickt wird eine nachricht abgeschickt und beim clienten "OnRead" Ereignis geschrieben, dass der socket.ReceiveText angezeigt werden soll. Aber dann kommt (logischerweise?) so ein Fehler, dass der send befehl keine ziel-adresse hat, wo er die nachricht hinschicken soll, oder so.
Was genau muss ich den da machen?
Hehe LoL @Elite
Hab wohl noch vergessen zu sagen, dass ich erst seit 3 tagen programmier und naja, getCursorPos sagt mir nicht viel. Hab zwar in der Hilfe nachgeguckt aber...naja...  Also ich hab z.B. einen Button (Maussteuerung) und wenn ich da raufklick (wenn ich mit einem clienten verbunden bin) dann soll die maus vom Clientenuser von mir gesteuert werden. Wie sieht denn da der Quellcode aus?
procedure tform1.......
begin
function GetCursorPos: TPoint ??????
Wer's bis hierhin geschafft hat zu lesen, respekt
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Do 14.10.04 12:53
Also, ich hab's jetzt fast hingekriegt mit dem Server: Serversocket1.socket.connections[0].sendText(sendText);
klappt auch. Ich kann jetzt mit dem server nachrichten an clienten verschicken, aber die zahl hinter "connections" muss genau der anzahl der clienten entsprechen, die mit mir connected sind. :/
Ich kann doch aber nicht jetzt schon wissen, wie viele connecten werden...
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.10.04 13:04
Du musst nicht in der Delphi-Hilfe, sondern in der Windows SDK (ein Eintrag darunter) nachsehen.
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Do 14.10.04 15:35
Windows SDK?? Was ist das denn schon wieder?
Aber hättest du mir nicht trotzdem einfach antworten können? 
|
|
jojo-sp
      
Beiträge: 317
Windows XP Prof, Vista Ultimate & Home Premium, Windows 7
Delphi 7 Enterprise, Delphi 2009
|
Verfasst: Do 14.10.04 16:01
Titel: TsTs
Da ich nur Delphi 4 nutze, weiss ich nicht, ob es bei den aktuelleren Versionen genau so ist, aber bei Delphi 4 ist im Ordner "C:\Programme\Borland\Delphi4\Demos\Internet\Chat" ein Beispiel für ein Chat Programm über Socket.
Ist zwar nicht Benutzerfreundlich, aber das lässt sich ja ändern.
MfG JoJo
Wenn das Chat-Prog über Netzwerk laufen soll, dann kann man nach allen Rechnern im Netzwerk suchen und dann di Anzahl der Clients festlegen.
Hab ich nicht ausprobiert, aber es wär mal ne Idee.
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Do 14.10.04 19:30
Japp das wär mal ne Idee, aber dazu müsste ich wissen wie das geht.
Aber dann müsste diese Clientesuche ständig laufen und den "connections-wert" auch immer auf dem laufenen halten.
Und das mit dem Delphi Chat. Hmm...also der Quellcode ist mir n bisschen zu kompliziert. Kenn die meisten Befehle ja gar nicht. aber da steht auch ServerSocket.socket.connections[0].sendText(...) und nichts weiter.
Und ich hab den Chat ausprobiert: Genau wie meiner. Die Clienten können zwar beide zum server was schicken, der Server aber schickt nur einem von beiden eine Nachricht.
|
|
jojo-sp
      
Beiträge: 317
Windows XP Prof, Vista Ultimate & Home Premium, Windows 7
Delphi 7 Enterprise, Delphi 2009
|
Verfasst: Fr 15.10.04 11:05
Gib doch in einer stringlist o.ä. die mit dem Server verbundenen Clients und die ID an, und wenn du etwas an einen Client schicken willst, gib dessen ID aus der Liste der Clients dann an. So würde ich es (versuchen) zu machen.
Wenn das, was ich gesagt habe, Falsch ist oder nicht funktioniert, dann macht mich ruhig fertig oder korrigiert, da ich noch nicht so viel Ahnung vom Proggen habe. 
|
|
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 15.10.04 11:38
| arcitC|Crash hat folgendes geschrieben: | Aber hättest du mir nicht trotzdem einfach antworten können?  |
Ja, kann ich. Aber das macht mir mehr Arbeit und für dich kommt weniger bei raus
Also zunächst mal musst du alle anderen Probleme abarbeiten. Das heißt:
1. Verwaltung aktiver Clienten (TList)
2. Was passiert, wenn ein Client beendet wird? Wie wird das bemerkt?
3. Entwicklung einer Befehlstruktur.
4. Verarbeitung von eingehenden Befehlen und Daten.
5. Verknüpfung mit der Oberfläche
Wenn du das soweit fertig hast, wird es dir ein leichtes sein, immer neue Befehle (und somit Funktionen) hinzuzufügen - ohne dabei dein Konzept zu ändern. Hier ist meine momentane Befehlsliste:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| PING: TSignal = 0; TEXT_MESSAGE: TSignal = 1; SHUTDOWN: TSignal = 2; SET_CURSOR: TSignal = 3; GIVE_CURSOR: TSignal = 4; START_REMOTE: TSignal = 5; GIVE_SCREEN: TSignal = 6; STOP_REMOTE: TSignal = 7;
SET_DESKTOP: TSignal = 8; |
Ich kann dir auch mal den gesamten Quellcode geben, aber ich muss vorher noch eine Urheberechtsfrage wegen der benutzten Icons klären.
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Fr 15.10.04 11:40
Ich dich fertig machen?? Haha lol! Nee ne, ich hab doch selber erst vor 4 Tagen angefangen und noch weniger ahnung als du.
Aber mit welchem Befehl erkennt denn der Server, welceh Clienten alles mit ihm verbunden sind? Obwohl, ich glaub ich wüsste schon wie, glaub ich, aber da ist ja dann wieder das Problem: Ich weiß nicht wie man dem Server sagen kann an wen er die Nachricht schicken soll. ServerSocket1.socket.connections[...].sendText
Das ist das einzige ws ich kenne. Und steht ja nicth die genau Adresse eines Clienten.
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Fr 15.10.04 11:43
Ich dich fertig machen?? Haha lol! Nee ne, ich hab doch selber erst vor 4 Tagen angefangen und noch weniger ahnung als du.
Aber mit welchem Befehl erkennt denn der Server, welceh Clienten alles mit ihm verbunden sind? Obwohl, ich glaub ich wüsste schon wie, glaub ich, aber da ist ja dann wieder das Problem: Ich weiß nicht wie man dem Server sagen kann an wen er die Nachricht schicken soll. ServerSocket1.socket.connections[...].sendText
Das ist das einzige ws ich kenne. Und steht ja nicth die genau Adresse eines Clienten.
Verdammt, warum ist das 2-mal hier??
Naja, ich hab noch ein paar kleine Probleme:
1.Also noch mal zur Wiederholung  . Der Server soll Nachrichten an Clienten schicken können, indem man dem Server die genaue Adresse des/der Clienten vorgibt
2.Wenn man Nachrichten verschickt, dann ist im Memo-Feld zwischen den Nachrichten immer eine Leerzeile...
3.(Niedrigste Priorität) Wenn der Server Nachrichten bekommt, dann dauert das ca. 10 sek. bis sie bei ihm ankommen und solange kann man beim Server nichts machen. Bei den clienten ist aber alles normal.
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Mi 20.10.04 18:44
Oh man ich fühl mich irgendwie blöd...
1. Haha, hab deine Antowrt gar nicht gesehen -.-
2. Was für ein Eintrag unter der Delphi-Hilfe?? Da ist nichts mit Windows SDK oder so, sondern nur Inhalt, Index und dann Links zu den HPs.
3. Deine Befehlsliste kapier ich nicht sry. Alles was du da geschrieben hast, macht für mich keinen Sinn
Die dickgedruckten Befehle gibt es bei mir nicht, genauso wenig dieses TSignal... also kp was du meinst.
|
|
arcitC|Crash
      
Beiträge: 88
D4 weiter weiß ich net
|
Verfasst: Mo 25.10.04 16:29
Gut. Alsoooo, nachdem das Problem mit den mehreren Clienten gelöst ist, jetzt noch mal die andere Frage: Warum wird zwischen den Nachrichten immer eine Zeile freigelassen?
Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.ServerSocket1ClientRead(Sender: TObject; //bei erhaltenem Text Socket: TCustomWinSocket); begin memo1.lines.Add(socket.RemoteHost + '(' + socket.RemoteAddress + ')' + ': ' + socket.receiveText); end; |
|
|