服务器端和客户端编程之间有什么区别?


104

我见过一些问题(主要是关于Stack Overflow的问题),这些问题缺少这些基本知识。这个问题的重点是为寻求它的人和引用它的人提供良好的信息。

在Web编程的上下文中,服务器端编程和客户端编程之间有什么区别?哪些语言属于哪种语言,何时使用它们?


5
服务器端编程是使用服务器支持的语言(例如Java,PHP,C#;可以编写在JavaScript中在服务器端执行的代码)来编写在服务器上运行的代码。客户端编程是编写将在客户端上运行的代码,并以可被浏览器执行的语言(例如JavaScript)完成。
FrustratedWithFormsDesigner 2012年

1

7
我认为您应该在仅涉及Web编程的问题中加入答案,因为按照目前的形式,答案还不完整。例如,服务器与客户端之间的通信无需使用HTTP;客户端可能不会使用浏览器等
K.Steff

@KSteff,欢迎您编辑我的问题以添加该内容。
Madara Uchiha 2012年

2
当网络还很年轻时,最好将大部分逻辑放在服务器端(java / c ++)上,并有意使浏览器逻辑保持精简状态-特别是因为那时的浏览器还没有准备好迎接黄金时间。现在,这种强调已经发生了逆转,以致基于浏览器的工具(Angular.js)成为了如今大量Web应用程序繁重逻辑所驻留的地方(远离了日益精简的服务器端逻辑)。现代工业强度的浏览器运行非常快的javascript引擎(在本机代码的数量级内),已经促进了这一点。
Scott Stensland 2014年

Answers:


123

背景

Web开发与通信有关。在这种情况下,通过HTTP协议在两(2)个参与者之间进行通信:

  • 服务器 -此方负责服务页面。
  • 客户端 -此方要求从网页服务器,并将它们显示给用户。在大多数情况下,客户端是Web浏览器
    • 用户 -用户使用客户端,以浏览网页,填写表单,在线观看视频等。

双方的编程均指在特定计算机(服务器或客户端)上运行的代码。

基本范例

  1. 用户打开他的网页浏览器(在客户端)。
  2. 用户浏览到http://google.com
  3. 客户端(上的代表用户),发送到请求http://google.com(该服务器),为他们的主页。
  4. 然后,服务器确认请求,并向客户端回复一些元数据(称为headers),后跟页面的源。
  5. 然后,客户端接收页面的来源,并将其呈现到人类可见的网站中。
  6. 用户类型Stack Overflow在搜索栏中,并按下Enter
  7. 客户端将数据提交给服务器
  8. 服务器处理这些数据,并与相匹配的搜索结果页面进行回复。
  9. 客户端,再次呈现该页面的用户来查看。

程式设计

服务器端编程

服务器端编程是服务器上运行的各种程序的总称。

用途

  • 处理用户输入。
  • 编译页面。
  • 结构化Web应用程序。
  • 与永久存储(SQL,文件)进行交互。

语言范例

  • 的PHP
  • 蟒蛇
  • C#,C ++或Visual Basic中的ASP.Net。
  • 几乎任何语言(C ++,C#,Java)。这些不是专门为该任务设计的,但现在经常用于应用程序级Web服务。

客户端编程

就像服务器端一样,客户端编程是在Client上运行的所有程序的名称。

用途

  • 制作交互式网页。
  • 使内容动态发生在网页上。
  • 与临时存储和本地存储(Cookies,localStorage)进行交互。
  • 将请求发送到服务器,并从中检索数据。
  • 为客户端应用程序提供远程服务,例如软件注册,内容交付或远程多人游戏。

语言范例

  • JavaScript(主要)
  • HTML *
  • CSS *
  • 在与远程服务交互的客户端设备上运行的任何语言都是客户端语言。

* HTML和CSS本身并不是真正的“编程语言”。它们是客户端用来呈现User页面的标记语法。


8
+1给出使用示例的好答案!只是挑剔:HTML和CSS实际上不是编程语言,因此可能不应该将它们与“ PHP,ASP和几乎任何一种语言(C ++,C#,Java)”进行比较。ActionScript可能是客户端语言的另一个很好的示例。
FrustratedWithFormsDesigner 2012年

5
您无法确定为什么服务器是服务器而客户端是客户端。客户端知道服务器,但是反之则不然。预计服务器将始终执行,没有客户期望。
克里斯·麦考尔

3
我要补充一个事实,即服务器环境受到更多控制。您不知道客户是什么。在客户端执行操作时(对于双方)也存在安全隐患。
stonemetal 2012年

1
因此,添加它,随意。
Madara Uchiha 2012年

1
我在某种程度上不同意@ChrisMcCall的定义。该规则可能会有例外,例如服务器可能依赖客户端来处理数据或向服务器提供服务以使服务器完成任务。客户也正在为SPA中的可扩展性和性能分担越来越多的负载。这些技术模糊了这个定义。更好的定义可能是最终用户和客户端是同义词。预计最终用户将存在于客户端设备上,而所有其他节点都将被视为服务器端。
RyanJMcGowan

27

用外行的话来说:

在这里,我将只谈论Web编程。

客户端编程主要与用户交互的用户界面有关。在Web开发中,运行该代码的是浏览器,即用户计算机中的浏览器,它主要是用javascript,Flash等完成的。此代码必须在各种浏览器中运行。

其主要任务是:

  • 验证输入(验证必须在服务器中完成。当速度非常关键时,可以在客户端中使用冗余验证来避免服务器调用。)
  • 动画
  • 操纵UI元素
  • 应用样式
  • 当您不希望页面刷新得如此频繁时,便完成了一些计算

负责人前端编程必须知道

  • javascript
  • 的CSS
  • 的HTML
  • 基本图形设计
  • 阿贾克斯
  • 也许闪光
  • 一些第三方JavaScript库,例如JQuery
  • UI设计
  • 信息设计等

服务器端编程与生成动态内容有关。它在服务器上运行。这些服务器中许多都是“无头的”。大多数网页不是静态的,它们搜索数据库以向用户显示更新的个性化信息。这些方面与后端(例如数据库)交互。

可以使用多种语言来完成此编程:

  • 的PHP
  • Java和jsp
  • 天冬氨酸
  • 佩尔
  • 蟒蛇
  • Ruby on Rails等

此代码与以下内容有关:

  • 查询数据库
  • 将数据编码为html
  • 将信息插入并更新到数据库
  • 业务规则和计算

服务器端编程负责人必须知道:

  • 上面提到的一些语言
  • 的HTML
  • SQL,
  • linux / unix shell脚本
  • 面向对象
  • 业务规则等

“前端编程负责人必须知道”必须吗?我想说,仅使用HTML,CSS,Javascript和Ajax,您就可以完美地生存。说服务器端编程与生成动态内容有关,而不是对客户端说同样的内容可能会给出错误的直觉……
nbro

“大多数网页不是静态的,它们搜索数据库是为了向用户显示更新的个性化信息。这与后端(例如数据库)进行交互。” 我将其改写为:“页面是通过动态部分填充动态内容而动态生成的,这些内容通常是从数据库中获取的。后端已经是与服务器端编程有关的所有内容,
IMO。– nbro

再说一次,总的来说,我会说“ ...一个人应该知道...”而不是“必须”……
nbro

@nbro为什么不写您自己的答案?

@ColeTrumbo我的评论和您的评论之间有什么联系?人们可以批评别人的答案以改善答案吗?
nbro

14

其他答案集中在什么是客户端和服务器端编程上:主要使用哪种语言,必须完成哪些任务等。

这是绝对正确的,但是我想念的焦点是在网络编程的上下文中两种编程类型之间的区别。让我尝试解决这个问题。

安全性和权限

在客户端编程中,出于安全考虑,您无权访问整个系统。用户不必一定会信任从Web下载并在其计算机上执行的每段代码,这是客户端环境(浏览器和JavaScript引擎)的主要设计目标:提供隔离的环境客户端代码可以执行,但不能访问允许范围之外的任何内容。

在服务器端编程中,最好还限制每个应用程序对底层系统的访问,但这对您的执行要少得多,因为最终您或您的公司将控制该系统。这种“隔离的笼子”设计不是内置于服务器端编程工具和语言中,而是通过安装设置(使用具有受限权限的专用用户,选择需要或不需要root权限的端口等)来完成的。

部署和平台

在服务器端编程中,必须使用某种工具(即使是make install或a git clone)从代码外部进行部署,并且此部署通常是手动的-至少应在半监督下进行方式。您在其上部署的系统(即OS)通常在许多计算机上是统一的,但是可以根据您的需求进行大量自定义。

在客户端编程中,部署是从服务器端代码进行的,该服务器端代码自动为客户端提供服务,而无需监督。在大量计算机上,底层系统(主要是浏览器)可能会有很大不同。为了使部署完全可行,必须保持标准,并且单一语言和环境的趋势越来越强。

这就是为什么将服务器端代码从一台计算机复制到另一台计算机可能要花几周的时间,而在其他计算机上执行客户端代码通常很简单的原因。

状态和次要影响

(免责声明:这是迄今为止最主观的观点。我的论证可能有很多错误方面。在我看来,这只是一个有趣的假设。)

在服务器端编程中,状态是一个更大的问题,这意味着如何根据用户的请求检索和更新数据,并可能由于并发而产生冲突。即使大部分复杂性都转移到了数据库服务器上,服务器端代码也有责任允许数据库通过正确使用其接口来保持其对数据完整性的保证(例如,不使用高速缓存来进行更新,而这些更新从未被用户看到)。 DB),这也是服务器端代码的目标,即不要使数据库超负荷工作并使用户等待响应。

在客户端编程中,将结果呈现给用户是一个更大的问题,这暗示了第二种效果(主要是打印到屏幕上)。这并不是说不涉及任何状态(例如cookie),而只是代码的主要目标是实际与用户交互,并且没有次要效果就不可能发生。

这就是为什么客户端编程通常需要(在某个时候)通过演示查看屏幕,以检查所有颜色和布局是否正确,而服务器端编程几乎只能在面向文本的环境中进行,因为在这种情况下,自动化测试检查逻辑是否仍在执行应做的工作。


3

这绝不是要接受的答案。相反,我将其作为补充问题(作为对when do you use each of them问题的回答)提供,到目前为止,其他答案中尚未提及:

知识产权保护

位于客户端的源代码(例如Javascript中的代码)易于阅读和/或能够被反向工程(如果被混淆)。

但是,位于服务器端的源代码可以安全地保护专有算法,并且只能返回结果。一个黑匣子。


是的,但这并不是最重要的一点,服务器在服务器之间,客户端在这里接收。某些逻辑最好在客户端上完成(例如,购物车,您不要让超市一直跟踪购物车,对吗?),而某些逻辑最好在服务器上完成(从数据库中获取信息)
Madara Uchiha

@MadaraUchiha,因此,序言是:“这绝不是要被接受的答案;我只是将其作为补充而已”
Kosta Kontos

那不应该是另一篇文章的一部分吗?我是新来的,但是拥有一个完整的答案比散落的答案更可取吗?
Julix
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.