| Autor |
Beitrag |
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Mi 05.10.05 16:25
Hallo,
ich suche nach möglichkeiten, wie ich eine Verbindung übers Internet / Lokalnetzwerk herstelle, mit der ich Dateien von Prog 1 nach Prog 2 und von 2 nach 1 schicken kann.
1)Ist das mit einer Technik möglich oder muss ich da wieder zwischen Netzwerk und INternet unterscheiden?
2)Ich hab wirklich keine Ahnung von der Materie, habt also bitte Gedult mit mir und schlagt mir net nur Facheusdrücke um die Ohr'n  .
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Mi 05.10.05 16:40
zu 1) Ich hab mal ein Chat-Programm mit den Indys fürs lokale Netzwerk geschrieben, das läuft auch über internet.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Mi 05.10.05 16:43
Kannst du mir dann sagen wie ich die Indys einsetzen muss, damit das bei mir klappt?
Und vorallem: Wie bekomme ich so ne Verbindung zum laufen, was müsste der Benutzer eingeben usw..., wenn alles fertig is?
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Mi 05.10.05 16:49
Ich habs über TidTCPServer und TidTCPClient gemacht. Bei mir ist es so, dass zuerst ausgewählt werden muss, ob das Prog als Server oder Client gestartet werden soll, außerdem muss bei Client noch die IP des Servers eingegeben werden. Der Client liest über einen Timer alle 0,5 s neue Nachrichten aus, der Server verschickt die Nachrichten, die vom Server kommen an alle Clients. (Brauchst du bei einem Chat für 2 natürlich nicht) Irgendwo gab es da aber auch schon ein Beispiel, ich weiß nur nicht wo.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Mi 05.10.05 17:23
Das Prog soll Schachspielen übers Internet / Netzwerk ermöglichen, ich bracuh also auch nur nen Server und nen Client. Kannst du vlt. etwas BspCode posten??
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Mi 05.10.05 17:52
Also ich poste mal was von meinem Code, die speziellen Sachen für den Chat hab ich mal rausgenommen, damit es übersichtlich bleibt.
Bei meinem Chat sind die Nachrichten immer wie folgt aufgebaut: Erst ein auf drei Buchtaben bestehendes Kommando, wie MSG (Message -> Nachricht), dann ein Leerzeichen, und dann der Text der Nachricht. Die Kommandos habe ich in String-Konstanten gespeichert.
Beispiel-Nachricht:
Quelltext
Also, das ist die OnExecute-Methode des TidTCPServers:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm2.IdTCPServerExecute(AContext: TIdContext); var lRow, lCmd,lother:String; nick,nachricht,command:String; i:Integer; begin lRow:=Trim(AContext.Connection.IOHandler.ReadLn); lCmd:=lRow; SetLength(lCmd,4); If AnsiSameText(lCmd, Join) Then begin end else if AnsiSameText(lCmd, Msg) then begin end else if AnsiSameText(lCmd, Leave) then begin end; end; |
Wenn der Server eine Nachricht an den Client schickt, kann diese Prozedur benutzt werden. (In diesem Fall ist halt nur ein Client vorhanden, ist aber eigentlich egal.)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm2.SendToAllClients(s:String); var list:TList; i:Integer; sCmd:String; begin List := idTcpServer.Contexts.LockList; for i:=0 to List.Count-1 do tIdContext(List.Items[i]).Connection.IOHandler.WriteLn(s); IdTCPServer.Contexts.UnlockList; end; |
Hierbei wird der Parameter s an alle Clients geschickt.
Auslese-Prozedur für den Client:
(Timer1 ist auf einen Intervall von 500ms eingestellt und standardmäßig deaktiviert)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm2.Timer1Timer(Sender: TObject); var lCmd,lRow,user:String; i:Integer; begin try lRow:=IdIOHandlerStack.ReadLn('',5); if lRow<>'' then begin lCmd:=lRow; SetLength(lCmd,4); if AnsiSameText(lCmd, cls) then begin Timer1.Enabled:=false; end else end; except IdTCPClient.Disconnect; MessageDlg('Verbindungsabbruch.',mtError,[mbOk],0); Timer1.Enabled:=false; end; end; |
Und zum Schluss noch das Verbinden. (Ich hoffe, die Namen der Edit-Felder sind für dich verständlich)
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:
| procedure TForm2.ButtonLogInClick(Sender: TObject); var str,strn:String; i:Integer; begin (Sender as TButton).Caption:='Verbinde...'; try try if RadioGroupType.ItemIndex=0 Then begin IdTCPServer.Active:=true; end else begin str:=MaskEditHostIp.Text; strn:=''; for i:=1 to Length(str) do if str[i]<>' 'then strn:=strn+str[i]; IdTCPClient.Host:=strn; IdTCPClient.Connect; IdIOHandlerStack.WriteLn(Join+EditNick.Text); Timer1.Enabled:=true; end; except on E: EidSocketError do begin case E.LastError of 10061: str:='Auf der Angegebenen Ip läuft unter dem angegebenen Port kein Server!'; 10060: str:='Die angegebene IP exisitiert nicht.'; else str:='Konnte nicht verbinden.' end; MessageDlg(str,mtError,[mbOK],0); end; end; finally if RadioGroupType.Enabled then (Sender as TButton).Caption:='Einloggen'; end; end; |
Das waren die wichtigsten Code-Ausschnitte, falls du dir alles noch anschauen willst, ich habe das Projekt als zip angehängt.
P.S.: Du brauchst die Indys in der Version 10, damit alles ohne Änderungen ausgeführt werden kann.
Einloggen, um Attachments anzusehen!
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 05.10.05 18:38
Ich verweise noch mal auf diesen Thread, indem ich angemerkt hatte, daß man nicht ohne weiteres im Server-OnExecute-Ereignis alles machen kann, was man will, man befindet sich nämlich dort nicht im VCL-Hauptthread.
Wenn du sowohl Client als auch Server entwickelst, kannst du dich ja mal mit den SIMPLETCP-Komponenten beschäftigen, die ich geschrieben habe; Diese lösen die Thread-Problematik halbwegs elegant, allerdings musst du dich dann mit der Benutzung von Streams zurechtfinden.
Cu,
Udontknow
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 05.10.05 18:39
Was für ein Zufall:
Ich habe gerade hier in der Libary ein Tutorial zum Thema erstellt.
Und die Methode aus meinem Tutorial ist kürzer als die Methode von Jakob oben.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Do 06.10.05 17:26
Udontknow hat folgendes geschrieben: | Ich verweise noch mal auf diesen Thread, indem ich angemerkt hatte, daß man nicht ohne weiteres im Server-OnExecute-Ereignis alles machen kann, was man will, man befindet sich nämlich dort nicht im VCL-Hauptthread.
Wenn du sowohl Client als auch Server entwickelst, kannst du dich ja mal mit den SIMPLETCP-Komponenten beschäftigen, die ich geschrieben habe; Diese lösen die Thread-Problematik halbwegs elegant, allerdings musst du dich dann mit der Benutzung von Streams zurechtfinden.
Cu,
Udontknow |
Streams = Fehlanzeige, noxch nie was mit gemacht.
@jakobwenzel: Könntest du mir evtl. zeigen, wie ich mit deiner Methode Dateien verschicke, ich hab mir deine mal angekuckt und würds gerne mit der machen, so es denn geht.
@Fabian Gärtner: Sei mir net bös, aber ich würde zuerst gerne die von jakob versuchen, ich komme später auf deinen Vorschlag zurück, falls die andere net geht 
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Fr 07.10.05 19:01
weiß ich nicht so genau, aber wozu musst du denn Dateien versenden?
Dateien versenden würde ungefähr so ablaufen, dass erst eine Art Ankündigung gesendet wird, dass jetzt eine Datei kommt, und dann wird die Datei gesendet. Aber an Streams wirst du nicht vorbeikommen, da die Datei (Glaube ich) als Stream empfangen werden muss.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Fr 07.10.05 21:15
Ja, stimmt eigentlich... Ich hatte mich halt im Vornherein auf ein Format festgelegt, muss mir mal n neues überlegen...
Ich studier jetzt ma dein ganzes Chatprog und melde mich falls es Probleme gibt.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Sa 08.10.05 10:24
Hallo,
also gröstenteisl versteh ich den Code bis auf folgende 2 Punkte:
1) Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function TForm1.ConnectToServer(Host: string; NickName: string):string; var str: string; begin result := ''; try Client.Host := Host; Client.Connect; IOHandlerStack.WriteLn(Join+NickName); Timer1.Enabled:=true; except on E: EidSocketError do begin case E.LastError of 10061: str:='Auf der Angegebenen Ip läuft unter dem angegebenen Port kein Server!'; 10060: str:='Die angegebene IP exisitiert nicht.'; else str:='Konnte nicht verbinden.' end; result := str; end; end; end; | Wird bei mir rot unterstrichen, was muss ich noch tun? Uses-Eintrag??
2) IOHandlerStack.WriteLn(Join+NickName);Mag zwar sein dass es funzt (weis ich noch net) aber warum funzt das. Ich hab ja nur den Handler auf's Formular gezogen... Benutzt der jetzt den Client oder wie???
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Sa 08.10.05 10:42
Also, du musst die Unit idStack einbinden, damit er de Fehler korrekt abfangen kann.
im idTCPServer musst du unter IOHandler den idServerIOHandlerStack ein stellen, im Client musst du unter IOHandler den idIOHandlerStack einstellen. Dann sollte es klappen.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Sa 08.10.05 11:30
Ah! Danke klappt
OK, ich glaube alles richtig umgesetzt zu haben. Ich hab aber leider keine Möglichkeit das zu testen... Könnte ich dir das Projekt bei Gelegenheit schicken, dass du dir das mal anschaust? Nur wenn dir's recht is natürlich.
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Sa 08.10.05 11:35
Du kannst das Programm doppelt starten, einmal als Client und einmal als Server und als IP 127.0.0.1 (localhost) eingeben. Dann kannst du sehehn, ob es funktioniert.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Sa 08.10.05 11:36
Super! danke. 
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Sa 08.10.05 11:49
| Zitat: | | Connection Closed Gracefully |
Sagt der Client, wenn ich verbinden will. Egal mit welcher IP... Ich schicke mal den Code zum verbinden...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function TForm1.ConnectToServer(Host: string; NickName: string):string; var str: string; begin result := ''; try Client.Host := Host; Client.Connect; IOHandlerStack.WriteLn(Join+NickName); Timer1.Enabled:=true; except on E: EidSocketError do begin case E.LastError of 10061: str:='Auf der Angegebenen Ip läuft unter dem angegebenen Port kein Server!'; 10060: str:='Die angegebene IP exisitiert nicht.'; else str:='Konnte nicht verbinden.' end; result := str; end; end; end; | Was kann da schief gehen??
EDIT: Halt!! Ich hab den Port auf 1025 gesetzt da alle unter 1025 doch für Windows sind oder?? Vorher wars 0. Jetzt kommt die Meldung dass unter der Angegeben IP unter dem angegebenen Port kein Server läuft... Woher weis ich welchen port ich einstellen muss???
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Sa 08.10.05 13:37
Fabian W. hat folgendes geschrieben: | | EDIT: Halt!! Ich hab den Port auf 1025 gesetzt da alle unter 1025 doch für Windows sind oder?? Vorher wars 0. Jetzt kommt die Meldung dass unter der Angegeben IP unter dem angegebenen Port kein Server läuft... Woher weis ich welchen port ich einstellen muss??? |
A propos: Wie bekomm ich die ID meines Servers raus? Kann ich die im Prog auslesen??
Wie gesagt, hab 0 Ahnung von der Materie, bitte habt Gedult... 
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Sa 08.10.05 13:39
Hast du den Port bei Server und Client auf 1025 gesetzt?
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Fabian W. 
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Sa 08.10.05 13:45
Ich find beim Server keine Port-eingenschaft?! Kann ich die nur zur Laufzeit einstllen??
|
|