różnica między programowaniem gniazd a programowaniem HTTP


Odpowiedzi:


109

HTTP to protokół aplikacji. Zasadniczo oznacza to, że sam HTTP nie może być używany do przesyłania informacji do / ze zdalnego punktu końcowego. Zamiast tego opiera się na podstawowym protokole, którym w przypadku HTTP jest TCP.

wprowadź opis obrazu tutaj

Możesz przeczytać więcej o warstwach OSI, jeśli jesteś zainteresowany.

Z drugiej strony gniazda są API, które większość systemów operacyjnych zapewnia, aby móc komunikować się z siecią. Interfejs API gniazda obsługuje różne protokoły od warstwy transportowej i w dół.

Oznacza to, że jeśli chcesz używać TCP, używasz gniazd. Ale możesz również używać gniazd do komunikacji za pomocą protokołu HTTP, ale wtedy musisz dekodować / zakodować wiadomości zgodnie ze specyfikacją HTTP ( RFC2616 ). Ponieważ może to być ogromne zadanie dla większości programistów, mamy również gotowych klientów w naszych frameworkach deweloperskich (takich jak .NET), na przykład klasy WebClientlub HttpWebRequest.


2
Więc oba używają TCP, po prostu HTTP odpowiada w predefiniowanym formacie, a gniazdo podaje dane zwrócone z innego końca gniazda, prawda?
आनंद

4
tak. TCP dba o to, aby wszystko dotarło (warstwa transportowa), a HTTP mówi, co powinny robić aplikacje internetowe.
jgauffin

25

W przypadku HTTP używasz protokołu HTTP wysokiego poziomu (który działa na górze gniazda). Jest bezsesyjny, co oznacza, że ​​wysyłasz żądanie tekstowe, takie jak GET google.comi otrzymujesz w zamian tekst lub dane binarne, po zamknięciu tego połączenia (w HTTP 1.1 dostępne są trwałe połączenia)

Przykład MSDN:

public static void Main (string[] args)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create (args[0]);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse ();

    Console.WriteLine ("Content length is {0}", response.ContentLength);
    Console.WriteLine ("Content type is {0}", response.ContentType);

    // Get the stream associated with the response.
    Stream receiveStream = response.GetResponseStream ();

    // Pipes the stream to a higher level stream reader with the required encoding format. 
    StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);

    Console.WriteLine ("Response stream received.");
    Console.WriteLine (readStream.ReadToEnd ());
    response.Close ();
    readStream.Close ();
} 

Dzięki gniazdom przechodzisz na niższy poziom i faktycznie kontrolujesz połączenie i wysyłasz / odbierasz surowe bajty.

Przykład:

var remoteEndpoint=new IPEndPoint(IPAddress.Loopback, 2345);
var socket = new Socket(remoteEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(remoteEndpoint);
socket.Send(new byte[] {1, 2, 3, 4});

Połączenie nie jest zamykane od HTTP 1.1.
Markiz Lorne

@EJP: zależy od ustawienia Connectionnagłówka;)
jgauffin

@jgauffin Exactly. To nie jest zamknięte chcąc nie chcąc.
Markiz Lorne

To prawda, ale takie są szczegóły OP wraz z innymi 95% informacjami na ten temat.
Anri,

13

Połączenie HTTP

  • Połączenie HTTP to protokół działający w gnieździe.
  • Połączenie HTTP jest abstrakcją wyższego poziomu połączenia sieciowego.
  • W przypadku połączenia HTTP implementacja zajmuje się wszystkimi tymi szczegółami wyższego poziomu i po prostu wysyła żądanie HTTP (niektóre informacje z nagłówka) i otrzymuje odpowiedź HTTP z serwera.

Połączenie z gniazdem

  • Socket służy do przesyłania danych między systemami. Po prostu łączy dwa systemy razem, adres IP to adres urządzenia w sieci opartej na IP.
  • Dzięki połączeniu przez gniazdo możesz zaprojektować własny protokół połączenia sieciowego między dwoma systemami.
  • W przypadku połączenia przez gniazdo musisz zadbać o wszystkie szczegóły niższego poziomu połączenia TCP / IP.

1

Programowanie HTTP lub żądanie HTTP są używane do luźnego łączenia i komunikacji w języku neutralnym dla platformy, gdzie jako programowanie w gniazdach jest używane, gdy system ma protokół specyfikacji języka


1
Co masz na myśli mówiąc język? Aplikacja java może komunikować się z aplikacją Python na przykład za pośrednictwem gniazd
Adam Hughes

Myślę, że ma na myśli to, że zazwyczaj, jeśli chcesz połączyć luźno powiązane (lub zupełnie różne) systemy, HTTP jest przydatny: interfejs zbudowany z pewnej technologii z wspieraną kompilacją z inną technologią, uzyskujący dostęp do zasobów w sieci poprzez adresy URL. Podczas gdy zazwyczaj, jeśli używasz protokołów połączeń niższego poziomu, takich jak TCP / UDP, prawdopodobnie organizujesz komunikację z systemami o podobnych technologiach (np. Różne aplikacje Java). Czy to jest poprawne? Sam staram się to zrozumieć.
Nicola Amadio

0

aby dwa punkty końcowe mogły ze sobą rozmawiać, oba powinny przestrzegać zestawu reguł. w komputerze ten zestaw reguł nazywa się protokołem.

na przykład w przypadku punktu końcowego, takiego jak przeglądarka, i innego, takiego jak serwer WWW, oba powinny przestrzegać zestawu reguł lub protokołu zwanego http, aby móc komunikować się i handlować informacjami. tak więc w sieci WWW i tego rodzaju komunikacji tylko ci, którzy mówią w oparciu o ten protokół http, mogą z powodzeniem rozmawiać ze sobą.

gniazdo to tylko punkt końcowy. może podążać za protokołem http, wchodząc w komunikację w www jako klient żądający strony lub może działać jako serwer nasłuchujący połączeń. a może mógłby przestrzegać innego zestawu reguł lub protokołów, takich jak ssh, ftp i komunikować się na inne sposoby.

teraz w programowaniu gniazd możesz stworzyć gniazdo, powiązać je z adresem IP i numerem portu, aby działało jako numer portu i powiedzieć mu, aby podążał za http, ssh, ftp lub cokolwiek chcesz, w oparciu o komunikację, której chcesz używać gniazdo dla.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.