Podczas wysyłania bajtów z bufora z normalnym gniazdem TCP, funkcja wysyłania zwraca liczbę bajtów wysłanego bufora. Jeśli jest to gniazdo bez blokowania lub wysyłanie nieblokujące, liczba wysłanych bajtów może być mniejsza niż rozmiar bufora. Jeśli jest to blokujące gniazdo lub blokowanie wysyłania, wówczas zwrócona liczba będzie odpowiadać rozmiarowi bufora, ale połączenie może blokować. W przypadku WebSockets dane przekazywane do metody wysyłania są zawsze wysyłane jako całość "wiadomości" lub wcale. Ponadto implementacje przeglądarki WebSocket nie blokują połączenia wysyłanego.
Istnieją jednak ważniejsze różnice po stronie odbiorcy. Kiedy odbiornik robi recv (lub czyta) na gnieździe TCP, nie ma gwarancji, że liczba zwróconych bajtów odpowiada pojedynczemu wysłaniu (lub zapisaniu) po stronie nadawcy. Może być taki sam, może być mniejszy (lub zero) i może być nawet większy (w tym przypadku odbierane są bajty z wielu wysyłek/zapisów). W przypadku WebSockets, odbiór komunikatu jest sterowany zdarzeniami (generalnie rejestruje się procedurę obsługi komunikatów), a dane w zdarzeniu są zawsze całą wiadomością wysłaną przez drugą stronę.
Zauważ, że możesz komunikować się przez komunikację za pomocą gniazd TCP, ale potrzebujesz dodatkowej warstwy/enkapsulacji, która dodaje do wiadomości dane ramek/granic wiadomości, dzięki czemu oryginalne wiadomości mogą zostać ponownie złożone z fragmentów. W rzeczywistości WebSockets jest zbudowany na normalnych gniazdach TCP i używa nagłówków ramek, które zawierają rozmiar każdej klatki i wskazują, które ramki są częścią wiadomości. Interfejs WebSocket API ponownie składa porcje danych TCP na ramki, które są składane w wiadomościach przed wywołaniem obsługi zdarzeń komunikatu raz na wiadomość.
Myślę, że twoje zdanie z Wikipedii jest trochę mylące. Z tego, co właśnie przeczytałem z twoich linków, wynika, że WebSockets to tylko połączenia HTTP TCP używane dla ruchu innego niż http. IE, negocjujesz z serwerem na połączeniu TCP z jego portem 80, aby użyć gniazda dla ruchu typu VPN lub coś podobnego. Tak więc websocket byłby po prostu gniazdem http, nie-http? Spitballing ... Nie wiem, co rozumieją przez "wiadomości" zamiast bajtów z fragmentu Wikipedii. – 0xhughes