Lorsque vous envoyez des octets à partir d'un tampon avec une socket TCP normale, la fonction send renvoie le nombre d'octets du tampon qui ont été envoyés. S'il s'agit d'une socket non bloquante ou d'un envoi non bloquant, le nombre d'octets envoyés peut être inférieur à la taille du tampon. S'il s'agit d'une socket bloquante ou d'un envoi bloquant, le nombre d'octets renvoyés correspondra à la taille du tampon, mais l'appel peut être bloqué. Avec les WebSockets, les données transmises à la méthode d'envoi sont toujours envoyées sous forme de "message" complet ou pas du tout. En outre, les implémentations WebSocket des navigateurs ne bloquent pas l'appel send.
Mais il existe des différences plus importantes du côté de la réception. Lorsque le récepteur fait un recv
(ou read
) sur une socket TCP, il n'y a aucune garantie que le nombre d'octets retournés corresponde à un seul envoi (ou écriture) du côté de l'expéditeur. Il peut être identique, inférieur (ou nul) ou supérieur (dans ce cas, des octets provenant de plusieurs envois/écritures sont reçus). Avec les WebSockets, le destinataire d'un message est guidé par un événement (vous enregistrez généralement une routine de gestion des messages), et les données contenues dans l'événement sont toujours le message complet envoyé par l'autre partie.
Notez qu'il est possible d'établir une communication basée sur des messages à l'aide de sockets TCP, mais il faut une couche/encapsulation supplémentaire qui ajoute des données d'encadrement/de limite de message aux messages afin que les messages originaux puissent être réassemblés à partir des morceaux. En fait, les WebSockets sont construits sur des sockets TCP normaux et utilisent des en-têtes de trame qui contiennent la taille de chaque trame et indiquent quelles trames font partie d'un message. L'API WebSocket réassemble les morceaux de données TCP en trames qui sont assemblées en messages avant d'invoquer le gestionnaire d'événement de message une fois par message.
1 votes
Je pense que votre phrase tirée de Wikipedia est un peu trompeuse. D'après ce que je viens de lire dans vos liens, il semble que les WebSockets soient simplement des connexions HTTP TCP utilisées pour le trafic non-http. En d'autres termes, vous négociez avec le serveur sur une connexion TCP au port 80 pour utiliser le socket pour un trafic de type VPN, par exemple. Donc une websocket serait juste une socket http non http ? Je ne sais pas... Je ne suis pas sûr de ce qu'ils entendent par "messages" au lieu d'octets dans l'extrait de Wikipedia.
5 votes
Messages : Donnez-moi une charge utile json, donnez-moi une autre charge utile json. Messages complets Flux d'octets : Donnez-moi n nombre d'octets, je répondrai par 100 Continue et vous me donnerez le n nombre d'octets suivant. Répétez jusqu'à ce qu'il n'y ait plus d'octets. Il s'agit de messages incomplets qui sont réassemblés sur le serveur. À utiliser pour le streaming et le chunking