Question

Je suis en train d'utiliser le EndianBinaryReader et EndianBinaryWriter que Jon Skeet a écrit dans le cadre de son misc utils lib . Il fonctionne très bien pour les deux usages, je l'ai fait.

La première lecture d'un flux réseau (TCPClient) où je suis assis dans une boucle la lecture des données qu'il entre en jeu. Je peux créer un seul EndianBinaryReader et puis juste jeter sur la fermeture de l'application. Je construis le EndianBinaryReader en passant le TCPClient.GetStream dans.

Je suis maintenant en train de faire la même chose lors de la lecture d'un UdpClient mais cela n'a pas un cours d'eau car il est moins connexion. si je reçois les données comme si

byte[] data = udpClientSnapShot.Receive(ref endpoint);

Je pourrais mettre ces données dans un flux de mémoire

var memoryStream = new MemoryStream(data);

puis créer le EndianBinaryReader

var endianbinaryReader = new EndianBinaryReader(
    new BigEndianBitConverter(), memoryStream,Encoding.ASCII);

mais cela signifie que je dois créer un nouveau lecteur endian chaque fois que je fais une lecture. Id-il un moyen où je peux créer un seul flux que je peux garder updateing InputStream avec les données du client udp?

Était-ce utile?

La solution

Je ne me souviens pas si les tampons de EndianBinaryReader - vous pourriez remplacer un seul MemoryStream? Mais pour être honnête, il y a très peu de frais généraux d'un objet supplémentaire ici. Quelle est la taille sont les paquets? (Mettre dans un MemoryStream va cloner le byte[]).

Je serais tenté d'utiliser la chose la plus simple qui fonctionne et voir s'il y a un vrai problème . Probablement le seul changement I serait faire est d'introduire using (car ils sont IDisposable):

using(var memoryStream = new MemoryStream(data))
using(var endianbinaryReader = ..blah..) {
    // use it
}

Autres conseils

Votre meilleure option est probablement une substitution de la classe Stream .NET pour fournir vos fonctionnalités personnalisées. La classe est conçue pour être Overridable avec un comportement personnalisé.

Il peut sembler intimidante en raison du nombre de membres, mais il est plus facile qu'il n'y paraît. Il y a un certain nombre de propriétés booléennes comme « CanWrite », etc. Remplacer les et ont tous retour « false » sauf pour la fonctionnalité que vos besoins de lecture (probablement CanRead est le seul dont vous avez besoin pour être vrai.)

Alors, juste remplacer toutes les méthodes qui commencent par l'expression « En cas de substitution dans une classe dérivée » dans l'aide Stream et ont les méthodes non pris en charge renvoient un "UnsupportedException"(au lieu de la valeur par défaut "NotImplementedException".

Mettre en œuvre la méthode Read pour renvoyer des données à partir de vos paquets UDP mises en mémoire tampon en utilisant peut-être une liste chaînée des tampons, réglage des tampons utilisés pour « null » que vous avez lu devant eux pour que l'empreinte mémoire ne se développe pas sans bornes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top