Autor Beitrag
hibbert
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 28.10.03 17:28 
Hi,
ich möchte gerne ein Programm schreiben, welches so ähnlich ist wie ICQ.

Ich habe mir gedacht, dass ich das am besten mit den Indy Server bzw. Client Komponenten machen kann.

Doch wie kann ich zwischen Indy-Server und Indy-Client Texte austauschen, sodass der andere diesen Text empfängt.

Kennt da jemand ein Tutorial oder kann mir jemand vielleicht einen Tipp geben ?

thx hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
lemming
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 470

Mac OS 10.3.1
Delphi 6 Pro, Kylix 3
BeitragVerfasst: Di 28.10.03 17:42 
Ich würde statt den Indy Components Fastnet UDP nehmen. Ist ja schließlich nur Text.

Siehe dazu die UDP Demo in ../demos/internet/udp/...
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 28.10.03 18:19 
mhhhh,
dieser Ordner existiert nicht, weder in den Demos von D6 noch in den Demos in D7.

Und wo kann ich die Komponenten von Fastnet herunterladen?

hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
achterburg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 30.10.03 00:06 
Hi,
möchtest du ein Programm schreiben, dass ICQ ersetzt oder einfach ein Chatprogramm, mit dem man sich zu seinem eigenen Server connected??

Texte kannst du austausch, in dem du für deinen INdy TCP Cleint erstmal einen Port und einen Host festlegst. Ersterer muss INteger sein, letzterer String. Folglich muss der Server einen gleichen Port besitzen, das stellst du unter Bindings oder Default Port ein. Dann kannst du mit tcpClient1.connect dich zum Server verbinden. Um daten zu schreiben, nimmst du entweder tcpcleint.writeln('..') oder tcpclient.writeint(längetext);
tcplientwritestr('..');

Um den Text zu lesen, musst du bim Server die OnExecute Methode aufrufen und da Server.ReadLN bzw Server.readint und server.readstr nehmen. Einer Variable würde ich diese WErte zuweisen, und dann sagen, meinetwegen, memo1.lines.add:=message (message:=Server.readln)

Viel Spaß, und wenn es nicht zuviel arbeit macht, poste dein Prog hier dochmal, würde mich mla interessieren :wink:
achterburg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 30.10.03 00:08 
Achso, bezüglich meinesVorredners: Ich habe noch nie mit Fastnet gearbeitet, daher habe ich dir die Indykomponenten vorgschlagen. Leigt daran, dass es bei mir einfach geht, gut, es stimmt, das UDP weniger aufwand macht und damit auhc braodcasts, zB im LAN möglich sind, allerdings auch nur, wenn kein Switch oder Router drin sitzt. :)

So, dann man viel Spaß
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Do 30.10.03 16:50 
ok, erstmal danke, dass du mir das erklärt hast.
Das hört sich alles vernünftig an. aber ich habe ein kleines problem beim Server:
Ich kann den befahl server.readln; nicht finden.

Ich habe jetzt die Komponenten von Indy (9.0) benutzt, undzwar diese hier:
- IdTCPClient1 umbenannt in Client1
- IdTCPServer1 umbenannt in Server1
und nun habe ich folgendes geschrieben:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.server1Execute(AThread: TIdPeerThread);
begin
memo1.Lines.Add(server1.readln);
end;

und der Compiler hat mir freundlicherweise geantwortet:
Compiler hat folgendes geschrieben:
[Fehler] Unit1.pas(30): Undefinierter Bezeichner: 'readln'

und das gleiche ist dann halt auch mit Readint & Readstr. :(

MfG Hibbert

ps. das mit dem Posten werde ich dann machen :wink:

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
achterburg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Do 30.10.03 18:13 
Hi,
lol, ichbin aber auhc mal wieder aufm Schlauch, also dsa geht natürlich nicht, dass ganze muss

ausblenden Delphi-Quelltext
1:
   msg := AThread.Connection.ReadLn;					


heissen. AThread ist ja der Thread, der oben im Procedure Kopf deklariert wird( procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
), allerdings muss ich zugeben, dass ich mich wegen technischer Hintergründe da auch gar nicht auskenne. (sorry)

Also, musst alles mit AThread machen, dann sollte es gehen. Außerdem heisst das ReadInteger und ReadString, kannste dir aber alles ganu ankucken, wenn du den punkt gesetzte hast. So, sorry, muss gerade noch was machen, bei Fragen immer gern,
CIAU
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Do 30.10.03 23:21 
Wow, nun funzt es, vielen dank !

aber eine kleine Frage habe ich jetzt noch, wie kann ich jetzt die Nachricht an alle verbundenen Clienten und wahlweise auch nur an einen Clienten zurückschicken?

thx hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
achterburg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 31.10.03 05:12 
Jo, dass istne gute Frage, die ich sicher nicht optimal lösen kann. Also cih würde bei jedem connecten des Clients seine eigene IP mitsenden, die durch den Server herausfiltern und in ein String-Area (Stringvar[] ) packen. Dann ne For Schleife und die einzelnen String Variablen abklappern (For i := 1 to anzahl Do Client.host:=Stringvar[i] ), allerdings geben ich zu, dass es sicherlich nur so als Notlösung gedacht werden kann. Einen Quelltext zum herausfinden der eigenen IP hab ich auch hier im Forum gefunden:

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:
24:
25:
26:
27:
28:
!!uses winsock!!

function TForm7.getIPs: Tstrings;
type
  TaPInAddr = array[0..10of PInAddr; 
  PaPInAddr = ^TaPInAddr; 
var 
  phe: PHostEnt;  
  pptr: PaPInAddr; 
  Buffer: array[0..63of Char;  
  I: Integer;
  GInitData: TWSAData;
begin 
  WSAStartup($101, GInitData);  
  Result := TstringList.Create;
  Result.Clear;
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  I    := 0;
  while pPtr^[I] <> nil do
  begin
    Result.Add(inet_ntoa(pptr^[I]^));
    Inc(I);  
  end;  
  WSACleanup;
end;


Dann musst du aber noch sagen, dass er diese IP auch hinzufügen soll, am besten definierst du dafür eine Id. Ich hab das anhand des ersten Buchstabens ausgemacht, also z.B

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
..
msg:=ATHread.ReadLN;
IF msg[1] = 'I' THEN 
 Begin 
 delete(msg,1,1);
 Stringvar[l]:=msg;
 inc(l); //l:=l+1;
 end
ELSE memo1.lines.add:=msg..


Aber sicherlich gibt es hier noch Leute, die es viel mehr drauf haben als ich, also meldet euch mal!

Weiterhin viel Glück, und vergoisss nicht das Resultat zu posten :wink: