разница между программированием сокетов и программированием Http

116

В чем разница между программированием сокетов и программированием Http? может кто-нибудь помочь, пожалуйста?

Новаторский мыслитель
источник

Ответы:

109

HTTP - это протокол приложения. По сути, это означает, что сам протокол HTTP не может использоваться для передачи информации в / из удаленной конечной точки. Вместо этого он полагается на базовый протокол, которым в случае HTTP является TCP.

введите описание изображения здесь

Вы можете узнать больше об уровнях OSI, если вам интересно.

С другой стороны, сокеты - это API, предоставляемый большинством операционных систем для связи с сетью. API сокетов поддерживает разные протоколы, начиная с транспортного уровня и ниже.

Это означает, что если вы хотите использовать TCP, вы используете сокеты. Но вы также можете использовать сокеты для связи с помощью HTTP, но тогда вам придется декодировать / кодировать сообщения в соответствии со спецификацией HTTP ( RFC2616 ). Поскольку это может быть огромной задачей для большинства разработчиков, мы также получили готовых клиентов в наших фреймворках для разработчиков (например, .NET), например классы WebClientили HttpWebRequest.

jgauffin
источник
2
Итак, оба используют TCP, просто HTTP отвечает в предопределенном формате, а сокет предоставляет данные, возвращенные с другого конца сокета, верно?
आनंद
4
Ага. TCP гарантирует, что все поступает (транспортный уровень), а HTTP сообщает, что должны делать веб-приложения.
Джгауффин
25

С HTTP вы используете протокол HTTP высокого уровня (который работает поверх сокета). Он не требует сеанса, что означает, что вы отправляете текстовый запрос, например, GET google.comи получаете взамен текстовые или двоичные данные после закрытия этого соединения (в HTTP 1.1 доступны постоянные соединения)

Пример 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 ();
} 

С сокетами вы переходите на уровень ниже и фактически контролируете соединение и отправляете / получаете необработанные байты.

Пример:

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});
Anri
источник
Соединение не закрывается из HTTP 1.1.
Маркиз Лорн,
@EJP: зависит от того, как установлен Connectionзаголовок;)
jgauffin
@jgauffin Совершенно верно. Он не закрывается волей-неволей.
Маркиз Лорн,
Верно, но именно эти подробности OP обнаружит сам вместе с другой 95% информацией по этой теме.
Анри
13

HTTP-соединение

  • HTTP-соединение - это протокол, работающий на сокете.
  • HTTP-соединение - это абстракция сетевого соединения более высокого уровня.
  • С HTTP-соединением реализация заботится обо всех этих высокоуровневых деталях и просто отправляет HTTP-запрос (некоторую информацию заголовка) и получает HTTP-ответ от сервера.

Подключение к розетке

  • Socket используется для передачи данных между системами. Он просто соединяет две системы вместе, IP-адрес - это адрес машины в IP-сети.
  • Используя сокетное соединение, вы можете разработать свой собственный протокол для сетевого соединения между двумя системами.
  • При подключении через сокет вам необходимо позаботиться обо всех деталях нижнего уровня подключения TCP / IP.
Амит Ядав
источник
1

HTTP-программирование или HTTP-запрос используется для слабой связи и платформенно-нейтральной языковой технологической связи, где как программирование сокетов используется, когда система имеет протокол спецификации языка

Mukund
источник
1
Что вы имеете в виду под языком? Java-приложение может связываться с приложением Python, например, через сокеты
Адам Хьюз,
Я думаю, он имеет в виду, что обычно, если вы хотите соединить слабосвязанные (или совершенно разные) системы, HTTP полезен: интерфейс, построенный с использованием какой-то технологии, с поддерживаемой сборкой с другой технологией, доступ к ресурсам в Интернете через URL-адреса. Тогда как обычно, если вы используете протоколы соединения более низкого уровня, такие как TCP / UDP, вы, вероятно, организуете взаимодействие с системами с аналогичными технологиями (например, с различными приложениями Java). Это правильно? Я сам пытаюсь это понять.
Никола Амадио
0

чтобы две конечные точки могли общаться друг с другом, они обе должны следовать набору правил. в компьютере этот набор правил называется протоколом.

например, для конечной точки, такой как браузер, и для другой, такой как веб-сервер, они оба должны следовать набору правил или протоколу, называемому http, чтобы иметь возможность общаться и обмениваться информацией. так что во всемирной паутине и при таком виде общения только те, кто общаются на основе этого протокола http, могут успешно общаться друг с другом.

сокет - это просто конечная точка. он может следовать протоколу http, чтобы войти в коммуникацию в www в качестве клиента, запрашивающего страницу, или он может действовать как сервер, прослушивающий соединения. или, может быть, он мог бы следовать другому набору правил или протоколов, таких как ssh, ftp, и взаимодействовать другими способами.

теперь в программировании сокетов вы можете создать сокет, привязать его к IP-адресу и номеру порта, чтобы он действовал как номер порта и сказал ему следовать http, ssh, ftp или как угодно, в зависимости от связи, которую вы хотите использовать. розетка для.

Mgh Gh
источник