2010-07-06 4 views
3

J'ai deux formulaires, un pour le serveur et un autre pour le client. Après avoir déposé ttcpserver sur le formulaire de serveur et définissant sa propriété localhost 127.0.0.1 et propriété localport à 55555 et propriété Active à true j'ai écrit un button1 (sendtextbutton) gestionnaire d'événements onclick:Impossible d'envoyer du texte (chaîne) de ttcpserver à ttcpclientserver

procedure TForm2.Button1Click(Sender: TObject); 
begin 
     TcpServer1.Sendln('message'); 
end; 

ensuite sur le formulaire client j'ai laissé tomber 1 TTcpClient une étiquette 2 boutons, ensemble clients propriété hôte distant pour 127.0.0.1 et le port distant à 55.555, a écrit un gestionnaire d'événements pour ConnectButton (button1):

procedure TForm2.Button1Click(Sender: TObject); 
begin 
try 
TcpClient1.Active := true; 
except 
showmessage('error'); 

end; 
end; 

a écrit un onConnect pour TTcpClient:

procedure TForm2.TcpClient1Connect(Sender: TObject); 
begin 
    Label1.Caption := 'connected!'; 
end; 

puis enfin une Hadler d'événement onrecieve pour TTcpClient:

procedure TForm2.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar; 
    var DataLen: Integer); 
begin 
    Label1.caption := TcpClient1.Receiveln(); 
end; 

Ma légende de programmes clients était censé changer de « message » (après s'être connecté et cliquez sur le bouton sur mon formulaire de serveur), mais il Doest. Est-ce que je le fais de la mauvaise façon? Si oui, alors comment le faire? J'essaie d'envoyer un message texte du serveur au client (Oui une connexion inversée!)

+0

Votre serveur ne parle pas au socket client. Voir ici pour un exemple: http://stackoverflow.com/questions/1591256/delphi-ttcpserver-connection-reset-when-reading – mjn

+0

@ mjustin: mais la légende de mon client étiquette tourne à connectée signifie que je suis connecté :( –

+3

le client est connecté, mais le serveur ne peut l'envoyer qu'en utilisant la bonne socket Comment 'TcpServer1.Sendln()' sait-il quel client doit recevoir les données (il peut y avoir plusieurs clients connectés en même temps)? il utilise 'ClientSocket.Sendln' côté serveur.Je peux aussi recommander Internet Direct (Indy) - vous trouverez plus d'exemples de code pour cela. – mjn

Répondre

2

TTcpServer ne stocke pas une liste de connexion connectée qui rend difficile les messages de style diffusion.

Je recommanderais de passer à TidTcpServer et TidTcpClient. Le composant TidTcpServer possède une propriété contextuelle que vous pouvez parcourir pour diffuser des messages aux clients similaires à ce que vous semblez vouloir faire.

Voici quelques liens vers des exemples d'utilisation TidTcpServer et TIdTcpClient:

+0

non je ne veux pas diffuser mon message juste l'envoyer d'un seul serveur à un seul client est tidtcpserver/tidtcpclient bon pour cela aussi? –

+0

Si vous n'avez qu'un seul client sur votre serveur, vous pourrez toujours utiliser les composants Indy. Mais en utilisant le composant TTcpServer, vous devrez faire le Sendln dans l'événement OnAccept(). –

+0

est l'événement onaccept déclenché chaque fois que le serveur est connecté au client? –

1

Votre code de serveur ne fonctionne pas parce que TTcpServer.SendLn() ne fait pas t envoyer les données à l'extrémité du client du socket connecté. C'est pourquoi le client ne voit jamais les données - il est envoyé dans les limbes.

Si la TTcpServer.BlockMode propriété est définie sur bmThreadBlocking (ce qui est par défaut), ou si le TTcpServer.BlockMode est réglé sur quoi que ce soit d'autre et vous êtes calliing manuellement la méthode parameterless surchargée TTcpServer.Accept(), le seul endroit où vous avez accès au client de Le point de terminaison provient de l'événement TTcpServer.OnAccept. Dans ces conditions, lorsque ce gestionnaire d'événements se ferme, le serveur déconnecte le client, de sorte que tout travail que le serveur souhaite effectuer avec le client doit être effectué depuis l'intérieur de cet événement.

Si cela ne convient pas à vos besoins, alors vous devrez définir la propriété TTcpServer.BlockMode soit bmBlocking ou bmNonBlocking puis appeler manuellement la méthode TTcpServer.Accept() surchargée qui retourne un objet TCustomIpClient. Une fois que l'événement TTcpServer.OnAccept a été déclenché et quitté, vous devenez propriétaire de cet objet et avez un contrôle total sur sa durée de vie. Vous pouvez y accéder dès que vous le souhaitez.

Questions connexes