高性能的网络通信包括以下方面:选择正确的数据格式和与之匹配的传输技术。

一、数据格式

  用于传输的数据格式有:

    1)html,仅适用于特定场合,传输数据量大,不过它可以节省客户端的CPU周期,

    2)XMl,相对笨重并且解析缓慢;

    3)json 轻量级,解析速度快

    4)字符分割的自定义格式十分轻量级,在解析大量数据集时快,不过需要编写额外的服务端构造程序,并在客户端解析。在创建自定义格式时,最重要的决定之一就是采用哪种分隔符,理想情况下,它应该是一个单字符,而且不应该存在于数据中,ASCII字符表的前几个字符在大多数服务端语言中能够正常工作而且容易书写,当然也可以作为split的承诺书。如\u0001,\u0002等。

二、客户端向服务器请求数据

  有五种常用技术用于向服务器请求数据。

  1)XMLHttpRequest(XHR)

  2)动态脚本注入

  3)iframes

  4)comet

  5)Multipart XHR

  其中,comet和iframes使用在极端情况下,这里不多做介绍。

2.1 XHR

  这是ajax的基础,用得很多了,它提供了最完善的控制和灵活性,可以设置或者修改http的请求头,并会把接收到的所有数据当成一个字符串,这有可能会降低解析速度。

2.2 动态脚本注入(jsonP的原理,和sql注入不同)

  动态脚本注入允许跨域请求和本地执行javascript和json,但是接口并不安全,以下是一个动态脚本注入的案例。、

  动态脚本注入提供的控制是有限的,不能设置请求的头信息,参数传递也只能采用GET方式,而非post。不能设置请求的超时处理或者重试。事实上,就算失败了也不一定知道。必须等待所有数据都已返回,才可以访问它们。

  此外重要的一点是,响应消息作为脚本标签的源码,必须是可执行的javascript代码,不能使用纯xml,纯json或者其他任何格式的数据,无论哪种格式,都必须封装在一个回调函数中。

  作为响应消息的js(dataStuct.js)代码:

function callback(name,age){
    return '{"name":name,"age":age}'
}

  调用部分的代码如下:

//动态脚本注入
var scriptElement=document.createElement('script');
scriptElement.src=".dataStruct.js";
document.getElementsByTagName(].appendChild(scriptElement);

var data=callback('bobo',27);
console.log(data);//输出{"name":"bobo","age":"27"}
console.log(JSON.parse(data).name);//输出bobo

使用这种技术,响应消息作为javascript直接执行,无需进一步处理。因此成为客户端获取并解析数据最快的方法,但是这种技术无法实现权限和访问控制,因此从那些无法控制的服务器上请求数据需要格外小心。

2.3 Multipart XHR

Multipart XHR是一种新技术,允许客户端只有一个http请求就可以从服务器向客户端传送多个资源,在这种技术中,任何数据类型都可以被javascript作为字符串发送。通过在服务器将资源(CSS文件,html片段,javascript代码或者base64编码的图片)打包成为一个由双方原定的字符分割的长字符串发送到客户端。然后javascript代码处理这个长字符串,并根据它的mime-type类型和传入的其他“头信息”解析出每个资源。以图片为例,图片不是由base64字符串转换成二进制,而是使用data:url的方式创建,并制定mime-type为images/jpg.

具体的实现代码这里暂略。

Multipart XHR最大的缺点是以这种方式获得的资源不能被浏览器缓存。因此在页面包含了大量其他地方用不到的资源(因此也无须缓存),尤其是图片的时候适用。毕竟http请求是ajax最大的瓶颈之一,因此减少其需求数量也会整个页面的性能有很多大提升。(感觉很适合于基站巡检系统图片的性能提升中)

3.客户端只需要向服务器发送数据

如果仅仅需要将数据发送到服务器,无需服务器返回数据时,有两种广泛使用的技术:XHR和信标。

  3.1 XHR

XHR就不多说了,既可以用于向服务器发送数据,也可用于向服务器请求数据。

  3.2图片信标(web beacons)

图片信标使用javascript创建一个新的image对象,并把src属性设置为服务器上脚本的url。该url包含了我们要通过get传回的键值对数据。它通常用作客户端与Web Analytics数据收集服务器间进行数据交换的桥梁,用于web网站统计用。大体代码如下:

var url='/status_tracker.php';
var params=['step=2','time=123456'];
(new image()).src=url+'?'+params.join('&');

通常有两种用法:

1)服务端仅接收数据,不反馈任何信息。创建的img也不会插入DOM。

2)服务器返回一个的透明图片(通常是1px*1px),此时可以接收数据,但仅限于非常少的几种方式,可以监听image对象的load事件,它会告诉服务器是否成功地接收了数据。此外还可以检查服务器返回的图片的长度和宽度(例如,宽度1代表成功,宽度2代表失败等等)

可见图片信标很简单,能做的事情也是有限的,无法post数据,同时由于url的长度有限,因此能否发送的数据量也是有限的。

  

javascript客户端与服务器端通信的更多相关文章

  1. C#Socket_TCP(客户端,服务器端通信)

    客户端与服务器通信,通过IP(识别主机)+端口号(识别应用程序). IP地址查询方式:Windows+R键,输入cmd,输入ipconfig. 端口号:可自行设定,但通常为4位. 服务器端: usin ...

  2. 客户端请求服务器端通信, Web 编程发展基础|乐字节

    乐字节的小伙伴们,好久不见,甚是想念啊! 前面我发布的文章算是把Java初级基础阶段讲完了,接下来小乐将会给大家接着讲Java中级阶段——Javaweb. 首先,我们要看看Javaweb阶段主要重点掌 ...

  3. WebSocket起航 JavaScript客户端和Server通信

    Message  =>JSON  => Move 客户端发给服务器总是Move  server.send(JSON.stringify({row: row, column: column} ...

  4. JavaScript中利用Ajax 实现客户端与服务器端通信(九)

    一:Ajax (Asynchronous JavaScript and XML)不是一个新的技术,事实上,它是一些旧有的成熟的技术以一种全新的更加强大的方式整合在一起 Ajax的关键技术: 1.使用X ...

  5. asp.net javascript客户端调用服务器端方法

    如何用js调用服务器端方法.首先服务器端方法的格式如下 [System.Web.Services.WebMethod]        public static void serverMethod(s ...

  6. android-------- socket 实现客户端与服务器端通信

    前面介绍了Socket的简介和原理,今天简单的来实现一下客服端与服务器通信的功能 客服端 建立连接 try { socket = new Socket("192.168.1.100" ...

  7. io流+网络+线程池 实现简单的多客户端与服务器端通信

    1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import ...

  8. Android客户端与Python服务器端通信之上传图片

    继上篇成功的与服务器端通信上之后,我现在需要将安卓本地的图片上传到服务端.服务端接收图片存下来. 参考:https://blog.csdn.net/qq_26906345/article/detail ...

  9. AngualrJS之服务器端通信

    译自<AngularJS> 与服务器通信 目前,我们已经接触过下面要谈的主题的主要内容,这些内容包括你的Angular应用如何规划设计.不同的angularjs部件如何装配在一起并正常工作 ...

随机推荐

  1. WCF服务承载(笔记)

    自托管(也做自承载) 承载 WCF 服务最灵活.最便捷的方法就是进行自承载.要能够自承载服务,必须满足两个条件.第一,需要 WCF 运行时:第二,需要可以承载 ServiceHost 的托管 .NET ...

  2. HTML5+CSS3+Jquery实现纯手工的垂直时光轴【附源码】

    前言 由于工作中需要,系统中需要记录不同时间发生的事件,为了提升用户体验,决定用时光轴来实现.[据说这个东西挺火的,QQ空间和FB都在用...] 这个时光轴是在 三生石上 这位博主的时光轴基础上修改的 ...

  3. c# 针对SAP服务通讯

    对于sap完全没有概念. 不知道是什么,也不想了解过多.还是像针对一个技能好好的研究一下. 年前的一个项目遇到c#调用SAP来实现一些业务逻辑对于我这个门外汉确实有点摸不着头闹.捋顺一下思路. . 结 ...

  4. LoadRunner 参数和变量的区别(未完)

    挺久没来更新了,坚持是件不容易的事呢,之后坚持每天总结下前一天的学习点 在LR中,参数是一种更高级的变量,他们能起到同样的效果,但同时也有几点不同 1. 定义方法不同 (这个还没看懂) 2. 调用语法 ...

  5. Struts2漏洞利用实例

    Struts2漏洞利用实例 如果存在struts2漏洞的站,administrator权限,但是无法加管理组,内网,shell访问500. 1.struts2 漏洞原理:struts2是一个框架,他在 ...

  6. cas单点登录时报Invalid credentials

    CAS4后默认的密码验证不是简单的相同了.在配置文件deployerConfigContext.xml里可以找到, 默认是 Username:casuser Password:Mellon

  7. NOIp #2009

    http://files.cnblogs.com/files/radiumlrb/NOIP2009%E6%8F%90%E9%AB%98%E7%BB%84%E5%A4%8D%E8%B5%9B%E8%AF ...

  8. 《bootstrap》实战---小问题,大Bug

    参照书中代码写了个示例,能够实现大页面单行导航,小页面显示收缩按钮,但是就是不能让收缩按钮发挥作用.也不知道哪儿出了问题. 想想算了,代码也不多,重新来吧.写道导航的时候,突然发现一个<nav& ...

  9. Xamarin的不归路-生成安卓错误

    编译生成安卓时提示错误 解决方案:删掉此文件夹(C:\Users\***\AppData\Local\Xamarin\)内所以文件夹和文件,再FQ重新编译即可. 2016年9月1日 13:33

  10. 服务器中配置多个Tomcat及内存溢出配置

    1.更改server.xml文件中端口(启动.关闭端口) 2.在startup.bat文件开头加上 SET JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0 ...