Autor Beitrag
Fabian W.
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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:
ausblenden Quelltext
1:
MSG Hallo!					


Also, das ist die OnExecute-Methode des TidTCPServers:

ausblenden 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);//Inhalte einlesen
  lCmd:=lRow;//--------\/
  SetLength(lCmd,4);// Kommando herauslesen
  If AnsiSameText(lCmd, Join) Then begin //Wenn der Client hinzukommt
  //Hier kann dann das Spiel gestartet werden
  end else if AnsiSameText(lCmd, Msg) then begin 
  //Wenn eine Nachricht gesendet wurde, in deinem Fall müsstest du die Positionen der Figur auslesen, ...
  end else if AnsiSameText(lCmd, Leave) then begin
//Der Client hat das Spiel verlassen, Spiel beenden
  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.)

ausblenden 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)
ausblenden 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);//Liest aus, wartet 5 ms auf ein Ergebnis, wenn kein String im Buffer liegt
    if lRow<>'' then begin //Wenn ein String empfangen wurde
      lCmd:=lRow;
      SetLength(lCmd,4);//Kommando vom Rest trennen
      if AnsiSameText(lCmd, cls) then begin
//Host beendet die Verbindung, hier Spiel beenden und Verbindung schließen
       Timer1.Enabled:=false;//Timer abstellen
      end else 
//Normale Nachricht, also gezogene Figur
    end;
  except//bei Verbindungsabbruch alle Verbindungen kappen und Spiel beenden
      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)

ausblenden volle Höhe 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:
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...';//Falls das Verbinden etwas länger dfauert, dem Benutzer eine Rückmeldung geben
  try
    try
      if RadioGroupType.ItemIndex=0 Then begin //Host
        IdTCPServer.Active:=true; //Server aktivieren
      end else begin                           //Client
        str:=MaskEditHostIp.Text;
        strn:='';
        for i:=1 to Length(str) do if str[i]<>' 'then strn:=strn+str[i];//IP-Adresse vorbereiten, ich benutze hier eine MaskEdit-Komponente, dabei können Leerzeichen auftreten, die hier gelöscht werden.
        IdTCPClient.Host:=strn;
        IdTCPClient.Connect;
        IdIOHandlerStack.WriteLn(Join+EditNick.Text);//Nachricht schreiben
        Timer1.Enabled:=true;//Halbsekündliche Abfrage aktivieren
      end;
    except//Fehlerbehandlung
      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//Button-Beschriftung zurücksetzen
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Suche in: Delphi-Forum 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Do 06.10.05 17:26 
user profile iconUdontknow 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 Suche in: Delphi-Forum 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Sa 08.10.05 10:24 
Hallo,

also gröstenteisl versteh ich den Code bis auf folgende 2 Punkte:

1)
ausblenden 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);//Nachricht schreiben
  Timer1.Enabled:=true;//Halbsekündliche Abfrage aktivieren
  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//Except
end;
Zitat:
E: EidSocketError
Wird bei mir rot unterstrichen, was muss ich noch tun? Uses-Eintrag??

2)IOHandlerStack.WriteLn(Join+NickName);//Nachricht schreibenMag 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Sa 08.10.05 11:36 
Super! danke. :-)
Fabian W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: 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...
ausblenden 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);//Nachricht schreiben
  Timer1.Enabled:=true;//Halbsekündliche Abfrage aktivieren
  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//Except
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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Sa 08.10.05 13:37 
user profile iconFabian 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... :oops:
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Sa 08.10.05 13:45 
Ich find beim Server keine Port-eingenschaft?! Kann ich die nur zur Laufzeit einstllen??