2011-09-07 14 views
11

Rozważałem wykonanie serwera czatowego przy użyciu pliku node.js/socket.io. Czy powinienem ustawić serwer TCP lub serwer HTTP? Wyobrażam sobie, że serwer tcp byłby bardziej wydajny, ale czy możesz wysyłać do niego inne rzeczy, takie jak załączniki do plików itp.? Jeśli tcp jest bardziej wydajny, o ile więcej? Zastanawiasz się również, ile jednoczesnych połączeń może obsługiwać jeden uchwyt serwera node.js? Czy więcej pracy wymaga TCP lub HTTP?Dyskusja: Serwer czatu przez node.js: HTTP lub TCP?

Odpowiedz

25

Mówisz o 2 całkowicie różnych podejściach tutaj - TCP jest protokołem warstwy transportowej, a HTTP jest protokołem warstwy aplikacji. HTTP (zwykle) działa przez TCP, więc niezależnie od wybranej opcji, nadal będzie działał przez TCP.

Pytanie dotyczące wydajności jest trochę dyskusyjne, ponieważ mówimy o innym OSI layers. Gdybyś poszedł na surowe gniazda TCP, twoje rozwiązanie byłoby prawdopodobnie bardziej wydajne - przynajmniej w paśmie - ponieważ HTTP zawiera całą masę dodatkowych danych (nagłówków), które prawdopodobnie nie mają znaczenia dla twoich celów (w zależności od skali czata program). To, o czym mówisz, to twój własny protokół warstwy aplikacji.

Możesz przesłać wszystko, co ci się podoba przez TCP - po tym, jak wszystkie HTTP mogą wysyłać załączniki i które działają przez TCP. FTP działa również przez TCP i jest przeznaczony wyłącznie do przesyłania "załączników". Aby to zrobić, musisz napisać protokół, aby mógł powiedzieć stronie zdalnej, że następujące dane były plikiem, a następnie wysłać dane pliku, a następnie poinformować stronę zdalną, że transfer został zakończony. Implementacje tego są bardzo różnorodne (podejście HTTP jest zupełnie inne niż podejście FTP), a twoje opcje są prawie nieskończone.

Nie wiem na pewno o limicie połączeń node.js, ale mogę powiedzieć z dużą dozą pewności, że jest on ograniczony przez system operacyjny. This może pomóc w opanowaniu odpowiedzi na to pytanie.

Można się zastanawiać, czy jest więcej pracy, aby to zrobić z TCP lub HTTP - jest to dużo pracy, aby to zrobić w obu. Prawdopodobnie chciałbym bardziej pochylić się nad wyborem opcji TCP. Podczas gdy protokół TCP wymagałby zaprojektowania protokołu, a nie aplikacji, jak również aplikacji, protokół HTTP nie jest szczególnie odpowiedni dla aplikacji dwukierunkowych, takich jak serwery czatu. Istnieje wiele implementacji czata za pośrednictwem protokołu HTTP, które używają AJAX, ale mogę powiedzieć z bolesnego doświadczenia, że ​​są one pełne bólu w tylnej części.

Powiedziałbym, że powinieneś patrzeć tylko na HTTP, jeśli chcesz, aby punkt końcowy (tj. Klient) był przeglądarką. Jeśli masz zamiar napisać aplikację komputerową dla punktu końcowego, bezpośredni link TCP zdecydowanie byłby do zrobienia. Głównym powodem tego jest fakt, że HTTP działa w trybie żądanie-odpowiedź, w którym klient wysyła żądanie do serwera, a serwer odpowiada. Przez TCP można otworzyć pojedynczy strumień TCP, który można wykorzystać do komunikacji dwukierunkowej. Oznacza to, że serwer może natychmiast wysłać zdarzenie do klienta, podczas gdy przez HTTP trzeba czekać na wysłanie żądania przez klienta, aby można było odpowiedzieć zdarzeniem. Jeśli zamierzałeś użyć przeglądarki jako klienta, sprawisz, że cała operacja przesyłania plików będzie dużo trudniejsza (przynajmniej wysyłanie).

Istnieją sposoby implementacji tego poprzez HTTP za pomocą długiego odpytywania i push serwera (read this), ale może to być bardzo trudne do wdrożenia.

Jeśli zamierzasz zaimplementować to w sieci LAN (lub nawet w Internecie), warto wziąć pod uwagę UDP przez TCP - w aplikacji czatu zazwyczaj nie ma absolutnie żadnego znaczenia, czy wiadomości przychodzą we właściwej kolejności, oraz nawet gdyby tak było, użytkownicy prawdopodobnie nie mogliby pisać szybciej niż wariacje opóźnień sieci (prawdopodobnie < 100ms). W przypadku transferów plików możesz wynegocjować oddzielne gniazdo TCP do wymiany danych (np. FTP) lub wdrożyć jakiś system UDP ACK (np. TFTP).

Mam dużo więcej do powiedzenia na ten temat, ale w tej chwili nie mogę tego wyrazić słowami - w pewnym momencie mogę rozszerzyć tę odpowiedź.

+0

Czy masz pojęcie, jak zrobić tcp ze stroną klienta node.js/socket.io? Mam to pytanie również tutaj: http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io – Derek

+0

btw. dzięki za wyjaśnienie. bardzo pomaga. Czy możesz jednak wyjaśnić więcej o udp i jego zaletach/wadach w porównaniu z tcp? Dzięki wielkie! – Derek

+0

Czy utrata pakietów udp wpływa na aplikację do czatu? – Derek

2

Serwery czatu to program Hello World w węźle. Użyj http.

Jeśli chodzi o to, ile współbieżnych połączeń może obsłużyć, to wszystko zależy od systemu. Skonfiguruj prosty serwer czatu, a następnie spróbuj go porównać.

Sprawdź również http://search.npmjs.org/ i wyszukaj chat dla kilku wskazówek.