2013-02-27 5 views

Odpowiedz

65

HTTP jest protokołem aplikacji. Zasadniczo oznacza to, że samego HTTP nie można użyć do transportu informacji do/z odległego punktu końcowego. Zamiast tego opiera się na podstawowym protokole, który w przypadku HTTP to TCP.

enter image description here

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

Gniazda to z kolei interfejs API, z którym większość systemów operacyjnych umożliwia komunikację z siecią. Interfejs API gniazda obsługuje różne protokoły z warstwy transportowej i nieruchome.

Oznacza to, że jeśli chcesz używać protokołu TCP, używaj gniazd. Ale możesz także używać gniazd do komunikacji przy użyciu protokołu HTTP, ale musisz zdekodować/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 programistycznych (takich jak .NET), na przykład klasach WebClient lub HttpWebRequest.

+0

Tak więc oba używają TCP, to tylko, że HTTP odpowiada w predefiniowanym formacie, a gniazdo podaje dane jako zwrócone z innego końca gniazda, prawda? –

+0

tak. TCP zapewnia, że ​​wszystko nadejdzie (warstwa transportowa), a HTTP powie, co powinny zrobić aplikacje internetowe. – jgauffin

19

Używając HTTP, korzystasz z wysokopoziomowego protokołu HTTP (działającego na górze gniazda). Jest to sesja mniej co oznacza wysłaniu żądania tekstową jak GET google.com i odbierać tekst lub dane binarne w zamian, po czym połączenie zostanie zamknięte (HTTP 1.1 trwałych połączeń są dostępne)

MSDN przykład:

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(); 
} 

Z gniazda idziesz 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}); 
+0

Połączenie nie jest zamknięte od HTTP 1.1. – EJP

+0

@EJP: zależy od ustawienia nagłówka 'Connection';) – jgauffin

+0

@jgauffin Dokładnie. To nie jest zamknięte, chcąc nie chcąc. – EJP

1

programowania HTTP, żądanie HTTP jest wykorzystywane do luźno sprzęgania i technologii język platformy obojętny łączności, w którym, jak gniazda programowania jest stosowany, gdy system posiada język protokół specyfikacji

+1

Co masz na myśli przez język? Aplikacja java może na przykład komunikować się z aplikacją Python za pośrednictwem gniazd –

2

połączenie HTTP

  • Połączenie HTTP to protokół działający na gnieździe.
  • Połączenie HTTP to abstrakcja wyższego poziomu połączenia sieciowego.
  • Przy połączeniu HTTP implementacja zajmuje się wszystkimi szczegółami wyższego poziomu i po prostu wysyła żądanie HTTP (niektóre informacje nagłówka ) i odbiera odpowiedź HTTP z serwera.

Połączenie Gniazdo

  • Gniazdo służy do przenoszenia danych pomiędzy systemami. Po prostu łączy dwa systemy razem, adres IP jest adresem urządzenia w sieci opartej na protokole IP.
  • Za pomocą połączenia z gniazdem można zaprojektować własny protokół połączenia sieciowego między dwoma systemami.
  • W przypadku połączenia z gniazdem należy zadbać o wszystkie szczegóły niższego poziomu połączenia TCP/IP.