2017-10-19 11 views
1

J'essaie de faire une communication TCP, où le serveur envoie un message toutes les x secondes via un socket, et doit cesser d'envoyer ces messages dans une certaine condition où le client N'envoie aucun message pendant 5 secondes. Pour être plus détaillé, le client envoie également des messages constants qui sont tous ignorés par le serveur sur le même socket que ci-dessus, et peuvent cesser de les envoyer à un moment indéterminé. Les messages sont, pour simplifier, utilisés comme des messages vivants pour informer le serveur que la communication est toujours pertinente. Le problème est que si je veux envoyer des messages répétés du serveur, je ne peux pas le laisser "occupé" et commencer à recevoir des messages à la place, ainsi je ne peux pas détecter quand un nouveau message arrive de l'autre côté .Détection lorsqu'un client tcp n'est pas actif pendant plus de 5 secondes

Le problème est indépendant du langage de programmation, mais pour être plus précis en utilisant python, et ne peut pas accéder au code du client.

Existe-t-il une option de réception et d'envoi simultanés de messages sur un seul socket?

Merci!

Répondre

0

Option 1

utilisation de deux fils, on va écrire dans la douille et la seconde lecture de celle-ci.

Cela fonctionne puisque les sockets sont en duplex intégral (permettent un accès simultané bidirectionnel).

Option 2

Utilisez un seul thread qui gère tous les garder alive en utilisant select.epoll. De cette façon, un thread peut gérer plusieurs clients. Souvenez-vous cependant que si ce n'est pas le seul thread qui utilise les sockets, vous devrez peut-être gérer la sécurité des threads par vous-même.

0

Comme nous l'avons vu dans une autre réponse, les threads sont une approche courante. L'autre approche consiste à utiliser une boucle d'événements et des E/S non bloquantes. Les versions récentes de Python (je pense à partir de 3.4) incluent un paquet appelé asyncio qui supporte cela.

Vous pouvez appeler la méthode create_connection sur un event_loop pour créer une connexion asyncio. Voir this example pour un serveur simple qui lit et écrit sur TCP.

Dans de nombreux cas, une boucle d'événements peut permettre des performances supérieures à celles des threads, mais elle présente l'inconvénient de nécessiter la plus grande partie ou la totalité de votre code pour prendre connaissance du modèle d'événement.