Entwickler-Ecke
Internet / Netzwerk - like ICQ
hibbert - Di 28.10.03 17:28
Titel: like ICQ
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
lemming - 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 - 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
achterburg - 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 - 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 - 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:
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:
achterburg - Do 30.10.03 18:13
Hi,
lol, ichbin aber auhc mal wieder aufm Schlauch, also dsa geht natürlich nicht, dass ganze muss
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 - 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
achterburg - 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:
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..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe: PHostEnt; pptr: PaPInAddr; Buffer: array[0..63] of 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
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); 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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!