Obtenir des tableaux d'octets à l'aide de connexions TCP
J'ai été en utilisant UDP
pour envoyer/recevoir des données mais maintenant, je veux passer à TCP
pour éviter la perte de paquets.
J'ai lu plusieurs tutoriels sur TCP
et a remarqué qu'au lieu d'utiliser DatagramPacket comme UDP
, TCP
utilise InputStream/OutputStream.
Comment pouvons-nous obtenir le byte[] de DataInputStream, quelque chose de similaire à ceci:
byte[] receiveData = new byte[64000];
DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
receiveData=receivePacket.getData();
Vous travaillez en Java?
Oui, je le suis. Oublié de le mentionner. L'édition du post maintenant...
êtes-vous en "streaming" des données ou de l'envoi de messages individuels?
Oui, je le suis. Oublié de le mentionner. L'édition du post maintenant...
êtes-vous en "streaming" des données ou de l'envoi de messages individuels?
OriginalL'auteur Dao Lam | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
La réponse en 2 parties. Affaire à 2 problèmes distincts se posent à vos questions est de.
1. Réseau des faits
TCP est fondamentalement basé sur les flux. c'est à dire l'Envoi de byte[1000] d'abord et ensuite byte[1200], est impossible à distinguer de l'envoi de byte[2200] une fois. Ce qui est fait envoyer sur le réseau peut très probablement être de 2 paquets, le premier étant un paquet avec 1400 octets et le second, 800, ou 1401 et 799, et peut varier à chaque fois. Le récepteur n'a aucun moyen de savoir que l'expéditeur a envoyé 1000 octets d'abord, et ensuite envoyé 1200 octets. C'est par la conception du réseau. Java n'a rien à voir avec cet état de fait. Et vous ne pouvez rien faire avec elle.
2. Java mise en œuvre
Sur le côté de l'expéditeur. Tout d'abord, vous avez besoin
OutputStream os = tcpsocket.getOutputStream();
. Et puis, à chaque fois, vous avez besoinos.write(byteArray)
. Sur Le côté du récepteur, vous devezInputStream is = tcpsocket.getInputStream();
. Et puis, à chaque fois, vous avez besoinis.read(byteArray)
. Notez que du côté du récepteur, de la quantité debyteArray
est en fait rempli sera retourné. Il peut être n'importe quel nombre entre 1 et la capacité de labyteArray
, et est indifférent à la façon dont l'expéditeur a envoyé.Pour faciliter la tâche, vous pouvez utiliser
DataInputStream is = new DataInputStream(tcpsocket.getInputStream());
au début, et l'utilisationis.readFully(byteArray)
chaque fois que vous avez besoin de lire quelque chose. De cette façon, il peut être garanti quebyteArray
sera toujours remplie.Mais vous ne pouvez jamais savoir combien d'octets que vous devriez recevoir, si la longueur est variable, sauf si vous ajoutez des informations supplémentaires. Par exemple, envoyer la longueur de la première, à l'aide de 4 octets. La façon dont vous le faire est généralement étroitement liée à votre cas d'utilisation. Et c'est à vous de
Je suis heureux que vous l'aimez.
Comment initialiser votre tableau d'octets puisque vous ne connaissez pas la taille de celui-ci encore? J'ai initialisé sa taille-64000 mais c'est en me faisant une erreur arrayindexoutofbounds problème quelque part d'autre dans mon code.
Ce qui est vrai. C'est pourquoi j'ai écrit dans le dernier paragraphe. Si vous pouvez élaborer sur ce que vous avez besoin de faire, je peux probablement vous donner une suggestion sur la façon dont vous pouvez le faire fonctionner.
Si le nombre d'octets reçus TOUJOURS être inférieure ou égale à la longueur réelle d'être envoyé? J'ai essayé de faire ce qui suit pour obtenir la taille du tableau:
int x = is.read(byteArray);
System.out.println(x);
mais x est plus grande que la taille de l'objet byteArray qui vous a été envoyé. Si cela devait se produire, ou suis-je en train de faire quelque chose de mal?OriginalL'auteur Haozhun
afin de mettre en place un message de protocole sur une prise (de courant), vous avez envie de venir avec un certain format de message, puis en lecture/écriture que sur l'une des extrémités de la connexion. un format très simple est d'écrire la longueur du message sous forme de 4 octets int, puis envoyez le message octets (puis rincer le cours d'eau). sur l'extrémité de réception, de lecture de 4 octets int, alors lisez la exactement ce que beaucoup de la suite d'octets (faire attention à ce que vous limitez votre lecture de l'appel de méthode ou vous risquez de lire le prochain message).
OriginalL'auteur jtahlborn