0
votes

XAMARIN / WINFORMS Les clients incapables de se connecter à une prise lors de l'envoi / de la réception dans une architecture à deux filetés

Objectif

Envoyer et recevoir un message de la prise TCP sur Deux threads différents dans un programme UI.

problème

Je ne peux pas me connecter à une prise et envoyer / recevoir des données uniquement lorsque Je suis en xamarin.Forms et Winforms. Donc, c'est une sorte de problème de filetage.

Lorsque j'essaye de le connecter, il suffit de le connecter ici donc il n'y a pas d'erreur ou rien.

Qu'est-ce que j'ai essayé

J'ai beaucoup travaillé avec Solution Matt Davis ici sur Stackoverflow .

J'ai créé un code de test ( tcpclientsendreceive ) chez GitHub avec tout le code nécessaire.

Mon code

Tout est tout sur github in Ce référentiel . Je ne peux pas le faire tout ici. Mais voici le Code de connexion qui ne semble pas Pour travailler avec, par exemple, xamarin.forms Voir Ce code ici .

si j'essaie de Connectez à mon Server de la console à partir d'une interface utilisateur Je ne peux pas vous connecter (Sorcière signifie que je ne peux pas envoyer / recevoir)

Le code de base fonctionne-t-il?

oui ça fait. Au moins lorsque j'exécute les deux programmes client / serveur, il envoie des données entre l'autre.

Quel pourrait être le problème?

Certainement de la configuration de la threading et de la manière dont il interagit avec l'interface utilisateur. Je manque juste d'une expérience de filetage suffisante pour pouvoir comprendre cela. J'espère que certains d'entre vous le font! : -)

EDIT:

Informations de Bounty

J'ai créé un page détaillée des informations sur Github afin que ce soit totalement clair de ce dont j'avais besoin.

J'ai ajouté lots d'images et de liens vers le code. Il devrait être très facile d'obtenir le code et d'essayer juste de l'essayer. s'il vous plaît essayez-le . Je ne pense vraiment pas que ce soit un gros problème pour un niveau inférieur de quelqu'un que moi.


4 commentaires

Pouvez-vous décrire l'erreur, etc. "Je ne peux pas me connecter" pourrait signifier des choses Lohas!


Oui désolé. J'ai mis à jour la question. Ça passe juste. C'est pourquoi j'ai ajouté la partie de délai d'expiration. J'ai essayé toutes sortes de versions de ce code. Mais cela fonctionne avec les applications Server / Console client, mais pas avec les applications UI.


Et si un côté est la console et l'autre est xamarin?


@noelicus qui est mon principal problème et mon configuration qui ne semble pas fonctionner. J'explique l'émulateur Android, puis le ServiceConsole. Jetez un coup d'œil aux détails de Ce numéro


3 Réponses :


0
votes

Que diriez-vous de cela? XXX PRE>

winform p>

 android p>

communication p>

si votre winform ne peut pas recevoir de message. Vous devez modifier la méthode surClient_MainAndaTarecedece sur P>

this.Invoke((MethodInvoker)delegate ()
            {
                txbResponseFromServer.AppendText(Environment.NewLine);
                txbResponseFromServer.AppendText(e.Data);
            });


4 commentaires

Cela semble prometteur. N'oubliez-vous de faire un PR sur GitHub avec la mise en œuvre complète afin que je puisse l'essayer?


J'ai changé juste votre main. J'ai vérifié le paquet avec Wireshark. Maintenant, votre demande client a envoyé des paquets. Mais votre BinaryReader ne peut pas recevoir de paquet. Je ne sais pas pourquoi ... J'ai trouvé de nombreux sites Web. Mais je n'ai pas pu trouver. J'ai donc changé votre auditeur. mon anglais est si mauvais. Donc, cette explication est ma limite ....


Ahh je vois. Merci beaucoup! Maintenant, le service reçoit au moins les données que le client envoie pour que le problème soit devenu pourquoi le client ne reçoit pas la réponse du service. Nous sommes à mi-chemin là-bas! P.S J'ai mis à jour le code GitHub avec votre code merci.


Votre client ne peut pas recevoir de message de recevoir?



0
votes

Le problème est que les clients et un serveur communiquent de manière incohérente. Serveur utilise BinaryReader code> et binarywriter code> et les clients écrivent / lisent des octets à un flux "brut" tel quel. La différence est que binarywriter code> écrit non seulement String code> octets mais aussi ses octets de longueur avant la chaîne code> elle-même et BinaryReader code> 'T Lisez tous les octets actuellement disponibles à partir du réseau et les convertit à une chaîne code> code> mais il lit la longueur d'abord, puis les handles en lisant la quantité exacte d'octet nécessaire pour obtenir une chaîne complète code> .

donc le plus facile utiliserait binarywriter code> et BinaryReader code> partout depuis leur lecture de données complexes ( string code>) octets, codant et décodage Pour vous. P>

Bien que la mise en œuvre du protocole de communication propre et que vous travaillez directement avec Networkstream code> Les méthodes d'octets de lecture / écriture vous donnent plus de flexibilité, cela nécessite un effort supplémentaire pour le faire fonctionner correctement. Par exemple, il existe une méthode unique pour lire plusieurs octets à partir du réseau P>

stream.Read(buffer, 0, n)


1 commentaires

J'ai créé la demande de traction pour cela.



0
votes

Je n'ai pas testé, mais je crois que je vois l'impasse dans cette méthode: https://github.com/sturlath/tcpclientsendreceive/blob/ A15C936889412E5A4AC249DF2B291DB817D40307 / TCPCLIENTLIB / client.cs # L37

Cela pourrait suffire à la corriger: P>

await Task.Run(() => _client.GetStream()).ConfigureAwait(false);


0 commentaires