Avatar billede sorenriis Nybegynder
05. december 2005 - 21:49 Der er 18 kommentarer og
3 løsninger

TCP med Indy 10

Har 2 problemer angående Indy 10 til Delphi 2005.

Jeg har for tiden en TCPServer og en TCPKlient kørende (chat-system).
Hertil har jeg 2 spørgsmål:

1) Er det muligt at sende en besked fra serveren til en specifik klient ip?
Hvis ja - hvordan?

2) Kan man få klienten til konstant at "lytte" efter nye beskeder, således at så snart serveren sender en besked får klienten den?
Hvis ja - hvordan?

På forhånd tak,
Søren
Avatar billede tolderlund Nybegynder
06. december 2005 - 11:13 #1
Siden du har brug for at begge ender skal kunne tage initiativet for at sende besked så skal du have en server og klient i begge ender.
Avatar billede nillinx Nybegynder
06. december 2005 - 11:22 #2
Er det sådan her du mener:"Klient-Server-Klient" ?
Avatar billede tolderlund Nybegynder
06. december 2005 - 12:52 #3
Nej jeg mener hvad jeg skrev: en server og klient i begge ender.
Man kan jo godt bruge både TIdTCPServer og TIdTCPClient i samme program.
Man kunne også bruge TIdUDPClient og TIdUDPServer, afhængig af det præcise behov.
Mulighederne er mange.
Avatar billede nillinx Nybegynder
06. december 2005 - 15:19 #4
Kan dog kun koden til at klienten skal sende text:

procedure TForm1.Button1Click(Sender: TObject);
begin
TcpClient1.RemoteHost := Edit1.Text;
TcpClient1.RemotePort := Edit2.Text;
try
  if TcpClient1.Connect then
  TcpClient1.Sendln(Edit3.Text) //Din meddelse.
  else
  ShowMessage('Not Connected');
  finally
  TcpClient1.Disconnect;
  end;
end;

Husk! Det kræver at TcpClient1 er: TcpClient1.Active := True;
Avatar billede sorenriis Nybegynder
06. december 2005 - 17:10 #5
Hvordan jeg sender en besked er jeg helt med på. Chatten fungerer som den er nu, men jeg vil gerne have ovenstående aspekt med ind.

Altså at klienten står og "lytter" efter beskeder + at serveren kan sende en besked til en bestemt klient/ip.

Jeg ved bare ikke hvordan nogle af de 2 ovenstående ting løses rent praktisk. Findes der en "listen" kommando i tcp-komponenten eller hvordan klares det?
Avatar billede kroning Nybegynder
06. december 2005 - 19:44 #6
Kan du ikke bare lade klienten logge på serveren og så lade være med at logge af igen så vil klienten jo hele tiden kunne modtage fra serveren og omvendt.
Avatar billede sorenriis Nybegynder
06. december 2005 - 21:21 #7
Mit problem består i at, som chatten kører nu, så skal klienten selv "spørge" serveren om der er nye beskeder. Det vil jeg gerne have lavet om således at ligesåsnart serveren sender en besked, så kan klienten fange den. Her kommer det med at klienten hele tiden skal stå og "lytte" efter beskeder ind i billedet (og ikke som nu, hvor klienten hvert 3 sekund spørger serveren efter nye beskeder).

På serversiden vil jeg så gerne have at jeg kan sende beskeden til en specifik klient - f.eks. ved at angive ip.

Men jeg ved ikke om det ovenstående er muligt eller hvordan man i så fald gør det i Delphi 2005. Det er det jeg gerne vil have hjælp til.
Avatar billede nillinx Nybegynder
06. december 2005 - 21:23 #8
Du skal bare lave så hver computer reagere som klient og server. Men det er ikke det du vil?
Avatar billede kroning Nybegynder
06. december 2005 - 22:12 #9
Hvis klienten alligevel spørger serveren hver 3. sekund så ville det da være bedre bare at holde forbindelsen og så er alle problemer jo løst.
Avatar billede sorenriis Nybegynder
06. december 2005 - 23:42 #10
Det er de ikke - med mindre der er noget jeg har misforstået. Klienten disconnecter aldrig fra serveren (med mindre brugeren aktivt gør det).

Som det er nu, så skal jeg sørge for at der er en "readln" kommando på klienten, når serveren sender data.

Så som det foregår nu, så sender klienten en "kommando" til serveren, hvorefter serveren sender beskederne retur. Serveren står nu og "hænger" indtil klienten har læst den sendte besked.

Derfor vil jeg gerne lave noget kode på klient-siden, som konstant "lytter" efter indkomne beskeder, således at jeg er fri for at sende en kommando til serveren for at bede om at få data retur.

Samtidigt vil jeg igen kunne sende data til en specifik klient, så jeg kan sende beskeder ud til lige den klient jeg vil.

Når en klient logger på gemmer jeg brugernavn, ip og id i et array. Så hvis man kan sende beskeder ud til en bestemt ip, så ville det være meget lækkert.
Avatar billede tolderlund Nybegynder
07. december 2005 - 12:42 #11
Som sagt:
Det kan du kun gøre ved at indbygge en server (TIdTCPServer eller TIdUDPServer) i klienten der kan modtage beskederne, og indbygge en klient (TIdTCPClient eller TIdUDPClient) i serveren der kan sende til en bestemt ip.
Avatar billede sorenriis Nybegynder
07. december 2005 - 12:54 #12
OK..
Hvordan får jeg så serveren til at stå og "lytte" efter beskeder, således at ligeså snart den modtager en besked, så gør den noget bestemt?

På en eller anden måde skal serveren jo vide hvad den skal sende af info.
Avatar billede tolderlund Nybegynder
07. december 2005 - 15:35 #13
Du skriver oprindeligt at du har TCPServer og en TCPKlient kørende så jeg går ud fra at du ved hvordan de bruges?
Du bliver nødt til at forklare dit problem nærmere.
Avatar billede kroning Nybegynder
07. december 2005 - 15:47 #14
Jeg kan forstå at du bruger Indy med ikke tråde, efter min mening kan indy kun bruges hvis man putter koden ind i en tråd da indy benytter blocking socket. Hvis du i stedet bruger TServerSocket og TClientSocket som følger med Delphi (fra Delphi 7+ skal de manuelt installeres) og som benytter sig af events i stedet så kan du nøjes med en TClientSocket på klient siden og en TServerSocket på server siden og så holde forbindelsen og alligevel undgå at programmet "hænger".
Indy er fint jeg bruger det selv men kun i tråde.
Avatar billede kroning Nybegynder
07. december 2005 - 15:55 #15
Jeg lavede et lille chat program i forbindelse med et andet indlæg (Clientsocket.sendHVAD), det benytter sig af TServerSocket og TClientSocket og har også en liste over hvem der er logget på. Det blev vist lidt rodet da det gik hurtig med at lave det men måske kan du få noget ud af det.
For at teste på en enkelt maskine gør følgende:
Start programmet 2 eller flere gange
Indtast din lokale IP i dem alle
Indtast forskellige navne i dem alle
Tryk på knappen "Er server" på en enkelt af dem
Tryk på knappen "Er klient (log på)" på alle de andre
Og så er det bare at indtaste tekst og trykke enter i dem alle.

Kan hentes her: http://www.kroning.dk/ChatTest.zip
Avatar billede sorenriis Nybegynder
07. december 2005 - 16:47 #16
TClientSocket og TServerSocket - Hvordan finder jeg dem i Delphi 2005?
Er det det samme som TTcpServer og TTcpClient i D2005?
Avatar billede sorenriis Nybegynder
07. december 2005 - 17:25 #17
Det var det vist ikke.
Jeg kan finde TClientSocket og TServerSocket i hjælp-menuen, men af en eller anden grund kan jeg ikke finde den knap der skal trykkes på for at tilføje dem?

Er det forresten bedre at bruge TClientWinSocket og TServerWinSocket? Dem kan jeg også slå op i hjælp-menuen, men mangler også her den "knap" der kan tilføje dem.
Avatar billede kroning Nybegynder
07. december 2005 - 18:45 #18
Question: The TClientSocket and TServerSocket components seem to be missing from my installation of Delphi 7?

Solution: You will need to add the dclsockets package to the IDE. To do this go to Component | Install Packages | Add (/bin/dclsockets70.bpl).

Måske er det det samme i 2005

Eller se her:
Les composants TClientSocket et TServerSocket ne sont plus installés par défaut avec Delphi 2005. Mais ils sont encore fournis. Il suffit d'installer le paquet /bin/dclsockets90.bpl via le menu Composants->Installer des paquets...

Så den hedder vist dclsockets90.bpl, mit fransk er ikke helt up to date
Avatar billede sorenriis Nybegynder
14. december 2005 - 01:03 #19
Super.. Fik det til at fungere.
Tak for svarene
Avatar billede sorenriis Nybegynder
14. december 2005 - 01:04 #20
Afgiv lige svar, hvis du også vil have del i points kroning.
Avatar billede kroning Nybegynder
14. december 2005 - 01:20 #21
k
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester