7
votes

C # Y a-t-il un moyen facile d'entrer dans la programmation de la prise TCP?

J'ai travaillé sur un programme utilisant des bases de données pour envoyer de petits messages d'un PC à un autre. Ce que j'ai fait est mis la base de données dans un dossier partagé, demandez au programme de l'autre PC qui est connecté (via un chemin, pas moins), et il y a un moyen simple et facile d'obtenir des messages sur les PC sur un réseau. Pas la meilleure option, mais ce n'est que des devoirs, et l'approche rapide et sale m'a fait une note.

Mais maintenant, les devoirs sont terminés et j'aimerais améliorer ce que j'ai fait. Le problème avec le programme est dans la phase de déploiement. Il y a trop de chemins de dossiers / d'installation et de problèmes d'administration / de partage concernant la trajectoire directement dans une base de données sur un dossier partagé.

Les bons gens ici à Stackoverflow m'ont conseillé d'essayer une programmation de socket, ce qui, à mon avis, est un peu sorti de ma ligue. Mais vous ne savez jamais ...

Aussi, je suis au courant de la différence entre la programmation Sync et Async Socket. Un bloc, l'autre ne le fait pas. Le programme que je travaille est un simple jeu à tour de rôle, alors je pensais que Synchronous pourrait être assez bon, car si ce n'est pas votre tour, vous ne pouvez vraiment rien faire. La question est cependant que le programme est traité comme "ne répondant pas". J'ai essayé asynchrone, mais j'ai couru dans des problèmes de filetage, ce que je considère comme la sortie de ma ligue.

logiquement, le programme est simple. Un hôte, un client. Lors de la connexion client, hôte envoie des données. Ensuite, le client reçoit, envoyez ses propres données. Et ainsi de suite, jusqu'à ce qu'un joueur perd.

Je suis désolé de dire que seule .NET 2.0 est installé dans mon école. Pas de wcf ou quoi que ce soit. En outre, il doit être fait dans C # Formulaires Windows, de sorte que XNA est sorti.

Alors, j'aimerais demander ... Y a-t-il un moyen facile d'entrer dans la programmation de la prise? Tous les guides / exemples de projets pouvant aider? Codes pré-créés pouvant être étudiés et adaptés?

La majorité des échantillons que j'ai trouvés et adaptés sont des applications de discussion, que je pensais assez bien, mais la rendant modulaire le casse simplement.


6 commentaires

Lisez la documentation du system.net.sockets < / a> Espace de noms.


Si vous prenez des luttes avec la complexité de la caisse de filetage, la classe Backworker Class MSDN .microsoft.com / fr-US / US / Bibliothèque / ... Cela simplifie les choses un peu


Vous pouvez envisager une autre option: les prises non bloquantes, qui vous permettent de sonder les données entrantes sur le "thread actuel". Cela peut coûter un peu de performance, mais je doute que l'un des joueurs remarquerait.


Seulement .net 2.0 sur votre école? Je déteste de ne pas préparer aux écoles de ne pas préparer leurs élèves pour ce qui est là-bas ....


+1 pour revenir pour apprendre à le faire de manière moins "insensée"!


Oui, eh bien, la première réponse à ma question précédente était "Ce que tu fais est fou!"


4 Réponses :


0
votes

J'ai fabriqué des classes qui peuvent être utilisées pour transporter des objets sur une prise à l'aide du Binarinformatter .

Voici quelques tests pour mon BinaireTransport Classe:

http://fadd.codeplex.com/sourcecontrol/changeSet/view/ 67972 # 1055425

la classe actuelle:

http://fadd.codeplex.com/sourcecontrol/changeset/view/ 67972 # 1054822

Notez que cela il y a quelque temps que je les ai écrites. Je viens de remarquer de petits bugs. Mais utilisez-les ou étudiez simplement les classes pour en savoir plus.


0 commentaires

1
votes

Les exemples d'applications de discussion que vous avez rencontrés devraient suffire. Ce n'est pas clair pour moi ce que vous appelez "le rendre modulaire".

Ce dont vous avez besoin est de concevoir un protocole à envoyer sur la connexion, un accord de règles afin de dire, de sorte que l'on sait ce que l'autre parle de. Donc, au lieu d'envoyer un texte brut (chat), vous pouvez envoyer ce qui suit:

0x03 (longueur du message)
0x0a (commande déplacer dans ce protocole de fiction)
0x02 (paramètre 1 de la commande, X coordonnée dans ce cas, tout est défini dans la conception du protocole)
0x05 (paramètre 2 de la commande, y coordonnée y dans ce cas, c'est tout défini dans la conception du protocole)

Maintenant, c'est tout à fait à vous ce qui se passe après avoir reçu et interprété les données. Personnellement, j'irais pour la solution ASYNC, car il laisse votre programme pour faire d'autres choses (graphiques?). Et il est plus facilement adaptable dans le code, dans mon expérience.


2 commentaires

Désolé, je n'ai pas effacé la partie "modulaire". Je pensais que ce serait trop long. Voir, la demande de discussion que j'ai étudiée et adaptée utilise ASYNC, je crois. Cela, je peux comprendre. C'est relativement simple. Cependant, mon programme appelle plusieurs fonctions avant d'envoyer et après avoir reçu des chaînes, des fonctions qui appliquent des changements d'interface graphique basés sur les chaînes reçues, ainsi que de modifier les chaînes à envoyer, en fonction de ce qui a été pressé sur l'interface graphique. Il est là où le programme (principalement enfiler) échoue.


Vous avez donc besoin de contrôle lorsque vous recevez les messages. Cela peut être fait en implémentant une file d'attente d'un message de classe, où le message contient les données interprétées par vous dans le rappel. Donc, chaque rappel vous analyser les messages entrants et la file d'attente. Ensuite, lorsque le moment est venu de regarder si des messages ont été reçus, vous pouvez simplement les regarder dans la file d'attente.



0
votes

Je me souviens quand j'ai commencé avec la communication de socket dans C # J'ai essayé de mettre en place un simple programme de discussion entre un client et un serveur, puis entre plusieurs clients. Voici le tutoriel que je lisais alors: http://www.codeproject.com/kb /Ip/tcpipchat.aspx

Si vous voulez le code complet, je peux télécharger mon projet final et vous pouvez étudier le code. Il utilise également des multithreading afin que vous puissiez voir comment gérer cette situation dans les applications GUI.

côté côté: WOW, cette idée de la base de données est la chose la plus folle que j'ai vue en termes de communication PC-to-PC. Bravo!


2 commentaires

J'ai également basé mon programme sur une demande de discussion, bien que mon succès soit plutôt limité. Quel type de projet travaillez-vous?


C'était également une application de discussion mais avec un routage de serveur entre plusieurs clients.



0
votes

Un exercice intéressant, utile et facile à faire pour apprendre sur les sockets (que C # facilite la tâche même) créait un enregistreur basé sur TCP.

Pendant le développement, chaque programmeur a besoin d'une façon de savoir ce qui se passe sous le capot à certains points. Sans un enregistreur, vous écrivez normalement quelque chose comme: xxx

qui entraîne une chaîne terne, non filtrée et non planifiée, jetée à la fenêtre de sortie.

J'ai créé Un enregistreur basé sur TCP très facilement en utilisant des sockets. D'une part, vous avez une application WinForms distincte (le serveur), qui est chargée d'écouter des messages entrants et de les afficher magnifiquement sur un contrôle de contenu riche. D'autre part, vous écrivez une classe très simple (le client) avec une seule fonction comme: xxx

J'ai créé cet enregistreur une fois et je l'utilise depuis. En outre, compte tenu de sa nature TCP, avec des modifications mineures sur le côté serveur, je l'utilise avec succès dans différentes langues, en tant que C # et Java, et en l'utilisant maintenant à partir d'ActionScript.


0 commentaires