2010-12-20 3 views
1

Je fais une application client-serveur dans .NET, mais maintenant j'ai le problème que j'essaie d'envoyer quelque chose, le client le lit et en lisant j'envoie quelque chose sinon ça fait de la merde des données envoyées.Le serveur TCP envoie trop vite .NET

Exemple:

  1. J'envoie essai
  2. client commence à lire
  3. J'envoyer endTest
  4. client lit Test @ $> @ is

est-il un moyen de résoudre ce? Maintenant je fais un Thread.Sleep(10) après un envoi mais je pense qu'il y a un meilleur moyen: P.

P.S. J'utilise NetworkStream.Write()/Read(), pas NetworkStream.BeginWrite()/BeginRead(). Lequel de ces deux est le meilleur et pourquoi?

+2

Quel encodage de caractères utilisez-vous? Pouvez-vous coller le code du serveur et le client? – cdhowie

+2

Le client ne devrait pas voir de mauvaises données juste parce que vous envoyez des données rapidement. Je soupçonne que le problème n'est pas dans le timing, mais quelque chose d'autre dans votre code. Nous ne pourrons pas aider sans * voir * le code. –

+2

qu'est-ce que vous utilisez pour envoyer/recevoir des données dans le client-serveur. Utilisez-vous le service web ou quoi? et poster du code pour que nous puissions comprendre votre problème. –

Répondre

0

Vous devriez chercher à utiliser WCF avec nettcpbinding pour ce genre de choses surtout si les deux extrémités (client/serveur) sont en C#. J'ai déjà eu des problèmes similaires en écrivant du code TCP personnalisé, mais je suis passé à wcf et c'est beaucoup plus facile et plus stable, donc vous pouvez simplement vous concentrer sur l'écriture de votre code d'application.

1

Le problème peut être que vous utilisez le même socket pour envoyer plusieurs "choses" de données. Vous savez peut-être que vous avez envoyé une chaîne, puis une image, mais TCP ne voit pas les objets séparés, seulement un seul flux d'octets.

Vous ne pouvez pas non plus connaître le nombre d'appels en lecture que vous devez effectuer pour obtenir votre "premier" objet de données. Pour délimiter plusieurs objets est en dehors de la portée de TCP. Le point étant, ce problème est mieux résolu en utilisant un seul socket par transaction. Créez un socket, écrivez vos données entières dans un seul appel d'écriture, puis fermez le socket. Demandez au client de lire jusqu'à ce que vous ayez l'intégralité des données. Si vous devez envoyer autre chose, créez une nouvelle socket. Je sais que ce n'est pas spécifique à la classe NetworkStream, mais j'espère que cela aide.

0

Si j'étais vous je créerais une règle, en envoyant et en recevant des données. Comme pour dire que vous avez un char de départ comme $ par exemple et * est le caractère de fin. Cela aidera votre système client/serveur à savoir quand lire ou écrire, et finalement éviter les erreurs dans le processus. donc en termes d'étapes:

  • client envoie un message $ Bonjour tout le monde *
  • serveur commence à lire quand il voit le $ et arrête après le *

là encore, peut-être un exemple de code de ce que vous faites pourrait nous aider à identifier exactement ce que vous faites mal.

Questions connexes