套接字编程和Http编程之间的区别


Answers:


109

HTTP是一种应用程序协议。从根本上讲,这意味着HTTP本身不能用于与远程端点之间传输信息。相反,它依赖于一个基础协议,在HTTP的情况下是TCP。

在此处输入图片说明

如果您有兴趣,可以阅读有关OSI层的更多信息。

另一方面,套接字是大多数操作系统提供的能够与网络通信的API。套接字API支持从传输层到下行的不同协议。

这意味着,如果您想使用TCP,则可以使用套接字。但是,您还可以使用套接字通过HTTP进行通信,但是随后您必须根据HTTP规范(RFC2616)对消息进行解码/编码。由于对于大多数开发人员而言,这可能是一项艰巨的任务,因此我们还在开发人员框架(例如.NET)中准备了就绪的客户端,例如WebClientHttpWebRequest类。


2
因此,两者都使用TCP,只是HTTP以预定义的格式响应,并且套接字提供了从套接字另一端返回的数据,对吗?
आनंद

4
是的 TCP确保一切都到达了(传输层),HTTP确保了Web应用程序应该做什么。
jgauffin

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

未从HTTP 1.1关闭连接。
罗恩侯爵

@EJP:取决于Connection标题的设置方式;)
jgauffin

@jgauffin确实如此。它不是故意关闭的。
洛恩侯爵,

没错,但这就是OP可以发现的细节以及与此主题相关的其他95%信息。
杏里

13

HTTP连接

  • HTTP连接是在套接字上运行的协议。
  • HTTP连接是网络连接的高层抽象。
  • 通过HTTP连接,该实现可以处理所有这些更高级别的细节,并且只需发送HTTP请求(一些标头信息)并从服务器接收HTTP响应。

插座连接

  • 套接字用于在系统之间传输数据。它只是将两个系统连接在一起,一个IP地址就是基于IP的网络上机器的地址。
  • 使用套接字连接,您可以为两个系统之间的网络连接设计自己的协议。
  • 使用套接字连接时,您需要注意TCP / IP连接的所有低级细节。

1

HTTP编程或HTTP请求用于与 系统具有语言规范协议的套接字编程之间进行的松耦合和与平台无关的语言技术通信


1
你的语言是什么意思?Java应用程序可以通过套接字与Python应用程序通信,例如
Adam Hughes

我认为他的意思是,通常,如果您要连接松散耦合(或完全不同)的系统,HTTP很有用:使用某些技术构建的前端与使用另一种技术进行后备构建的前端,可以通过URL访问Web上的资源。通常,如果使用的是TCP / UDP等较低级别的连接协议,则可能是在与具有类似技术的系统(例如,不同的Java应用程序)进行通信。这是正确的吗?我正在尝试自己理解它。
Nicola Amadio

0

为了使两个端点能够相互通信,它们都应遵循一组规则。在计算机中,这些规则集称为协议。

例如,对于像浏览器这样的端点,对于像Web服务器这样的端点,它们都应该遵循一套称为http的规则或协议,以便能够交流和交易信息。因此,在万维网和这种通信中,只有那些基于此http协议进行交谈的人才能成功地相互交谈。

套接字只是一个端点。它可以遵循http协议,作为客户端请求页面时在www中进行通信,也可以充当侦听连接的服务器。也许它可以遵循另一组规则或协议(例如ssh,ftp)并以其他方式进行通信。

现在在套接字编程中,您可以制作一个套接字,将其绑定到一个IP地址和一个端口号以充当端口号,并根据要使用的通信告诉它遵循http,ssh,ftp或您想要的任何内容插座。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.