Socket编程和HTTP编程的区别

140

套接字编程和HTTP编程有什么区别?可以有人帮忙吗?

6个回答

131

HTTP是一种应用协议。这基本上意味着HTTP本身不能用于将信息传输到/从远程端点。相反,它依赖于一个底层协议,而在HTTP的情况下就是TCP。

enter image description here

如果您对OSI层级感兴趣,可以了解更多相关信息。

另一方面,套接字是大多数操作系统提供的API,用于与网络通信。套接字API支持来自传输层及以下的不同协议。

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


3
所以两者都使用TCP,只是HTTP以预定义的格式响应,而套接字将数据返回为从套接字另一端返回的数据,对吗? - आनंद
4
没错,TCP 确保所有内容都到达(传输层),而 HTTP 告诉网络应用程序应该做什么。 - jgauffin

33
使用 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});

1
HTTP 1.1连接未关闭。 - user207421
@EJPпЉЪињЩеПЦеЖ≥дЇОConnectionе§іжШѓе¶ВдљХиЃЊзљЃзЪД ;) - jgauffin
@jgauffin 没错。它不是随意关闭的。 - user207421
没错,但这些细节OP将会自己发现,还有其他95%的相关信息。 - Anri

22

HTTP连接

  • HTTP连接是在套接字上运行的协议。
  • HTTP连接是网络连接的更高级抽象。
  • 使用HTTP连接,实现会处理所有这些更高级别的细节,并简单地发送HTTP请求(一些头信息)并从服务器接收HTTP响应。

套接字连接

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

使用HTTP连接,实现会处理所有这些更高级别的细节。我想你是指更低级别的细节。 - joedotnot

5
为了让两个端点能够相互通信,它们都需要遵循一组规则。在计算机中,这组规则被称为协议。
例如,像浏览器这样的端点和像 Web 服务器这样的另一个端点都应该遵循一组名为 HTTP 的规则或协议,以便进行通信并交换信息。因此,在万维网和这种通信中,只有那些基于 HTTP 协议进行通信的人才能成功地互相交流。
Socket 只是一个端点。它可以遵循 HTTP 协议,作为客户端请求页面在 WWW 中进行通信,也可以充当监听连接的服务器。或者,它可以遵循其他一些规则或协议,如 SSH、FTP 等,以其他方式进行通信。
现在,在 Socket 编程中,您可以创建一个 Socket,将其绑定到 IP 地址和端口号上,以充当端口号并告诉它遵循 HTTP、SSH、FTP 或任何你想要使用 Socket 进行通信的通信协议。

2

Socket编程是一种中间件,位于应用程序层和TCP层之间。它能够承载应用程序层中的任何内容,甚至包括HTTP数据。


1
HTTP编程或HTTP请求用于松散耦合和平台中立的语言技术通信,而套接字编程用于系统具有语言规范协议的情况。

1
语言是什么意思?例如,Java应用程序可以通过套接字与Python应用程序通信。 - Adam Hughes
我认为他的意思是,通常情况下,如果你想要连接松散耦合(或完全不同)的系统,HTTP是有用的:使用某种技术构建的前端与使用另一种技术构建的后端通过URL访问Web资源。而通常情况下,如果你使用像TCP/UDP这样的低级连接协议,你可能正在编排与具有类似技术的系统进行通信(例如不同的Java应用程序)。这样对吗?我自己也在努力理解它。 - Nicola Amadio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接