J'ai vu beaucoup de ressources, ici, sur DONC sur les Sockets. Je crois que aucun d'entre eux couverts les détails que je voulais savoir. Dans mon application, le serveur fait tout traitement et d'envoyer des mises à jour périodiques aux clients.
L'Intention de ce post est de couvrir toutes les idées de base requises lors de l'élaboration d'une prise d'application et de discuter des meilleures pratiques. Ici sont les choses de base que vous verrez avec presque tous les socket en fonction des applications.
1 - la Liaison et à l'écoute sur une socket
Je suis en utilisant le code suivant. Il fonctionne bien sur ma machine. Ai-je besoin de prendre soin de quelque chose d'autre quand je la déployer sur un serveur réel?
IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(localHost.AddressList[0], 4444);
serverSocket = new Socket(endPoint.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
2 - Réception de données
J'ai utilisé un 255 de la taille du tableau d'octets. Alors, quand je suis à recevoir des données qui est à plus de 255 octets, j'ai besoin d'appeler la méthode de réception jusqu'à ce que je obtenir la totalité des données, droit? Une fois que j'ai eu l'ensemble des données, j'ai besoin d'ajouter tous les octets reçus jusqu'à présent pour obtenir le message complet. Est-ce exact? Ou est-il une meilleure approche?
3 - l'Envoi de données et en spécifiant la longueur de données
Puisqu'il n'existe aucun moyen de TCP pour trouver la longueur du message de recevoir, j'ai l'intention d'ajouter de la longueur du message. Ce sera le premier octet du paquet. Donc, les systèmes client sait quelle quantité de données est disponible à la lecture.
Toute autre meilleure approche?
4 - fermer le client
Lorsque le client est fermé, il va envoyer un message au serveur indiquant la proximité. Serveur de supprimer les données du client à partir de la liste de clients. Voici le code utilisé côté client pour déconnecter le connecteur (partie messagerie n'apparaît pas).
client.Shutdown(SocketShutdown.Both);
client.Close();
Des suggestions ou des problèmes?
5 - la Fermeture du serveur
Le serveur envoie un message à tous les clients indiquant l'arrêt. Chaque client de débrancher la prise quand il reçoit ce message. Les Clients pourront envoyer le message de fermeture de serveur et de les fermer. Une fois que le serveur reçoit le message de fermeture de tous les clients, il débranche la prise et arrêter de les écouter. Appel Disposer sur chaque client sockets pour libérer les ressources. Est-ce la bonne démarche?
6 - client Inconnu déconnexions
Parfois, un client peut déconnecter sans en informer le serveur. Mon plan pour résoudre ce problème est: Quand le serveur envoie des messages à tous les clients, vérifier la prise état. Si il n'est pas connecté, retirez le client à partir de la liste de clients et de fermer la socket du client.
Toute aide serait super!