向服务器请求数据的五种技术

2023-11-16

   Ajax,在它最基本的层面,是一种与服务器通讯而不重载当前页面的方法,数据可从服务器获得或发送给服务器。有多种不同的方法构造这种通讯通道,每种方法都有自己的优势和限制。
      有五种常用技术用于向服务器请求数据:
      (1)XMLHttpRequest (XHR)
      (2)动态脚本标签插入
      (3)框架
      (4)Comet
      (5)多部分的XHR
      在现代高性能JavaScript中使用的三种技术是XHR,动态脚本标签插入和多部分的XHR。使用Comet和iframe(作为数据传输技术)往往是极限情况,不在这里讨论。

      一、XMLHttpRequest
      目前最常用的方法中,XMLHttpRequest(XHR)用来异步收发数据。所有现代浏览器都能够很好地支持它,而且能够精细地控制发送请求和数据接收。你可以向请求报文中添加任意的头信息和参数(包括GET和POST),并读取从服务器返回的头信息,以及响应文本自身。以下是使用示例:
      var url = '/data.php';
      var params = [
            'id=934875',
            'limit=20'
      ];
      var req = new XMLHttpRequest();
      req.onreadystatechange = function() {
            if (req.readyState=== 4) {
                  var responseHeaders = req.getAllResponseHeaders();
                  var data = req.responseText;
            }
      }
      req.open('GET', url + '?' + params.join('&'), true);
      req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
      req.send(null);
      此例显示了如何从URL请求数据,使用参数,以及如何读取响应报文和头信息。readyState等于4表示整个响应报文已经收并完可用于操作。
      readyState等于3则表示此时正在与服务器交互,响应报文还在传输之中。这就是所谓的“流”,它是提高数据请求性能的强大工具:
      req.onreadystatechange = function() {
            if (req.readyState=== 3) {
                  var dataSoFar = req.responseText;
                  …
            }
            else if (req.readyState=== 4) {
                  var data = req.responseText;
                  …
            }
      }
      由于XHR提供了高级别的控制,浏览器在上面增加了一些限制。你不能使用XHR从当前运行的代码域之外请求数据,而且老版本的IE 也不提供readyState3,它不支持流。从请求返回的数据像一个字符串或者一个XML对象那样对待,这意味着处理大量数据将相当缓慢。
尽管有这些缺点,XHR仍旧是最常用的请求数据技术,也是最强大的,它应当成为你的首选。
      当使用XHR请求数据时,你可以选择POST 或GET。如果请求不改变服务器状态只是取回数据(又称作幂等动作)则使用GET。GET请求被缓冲起来,如果你多次提取相同的数据可提高性能。
      只有当URL和参数的长度超过了2'048个字符时才使用POST提取数据。因为Internet Explorer限制URL的长度,过长将导致请求(参数)被截断。
      二、动态脚本标签插入
      该技术克服了XHR的最大限制:它可以从不同域的服务器上获取数据。这是一种黑客技术,而不是实例化一个专用对象,你用JavaScript创建了一个新脚本标签,并将它的源属性设置为一个指向不同域的URL。
      var scriptElement = document.createElement('script');
      scriptElement.src = 'http://any-domain.com/javascript/lib.js';
      document.getElementsByTagName_r('head')[0].appendChild(scriptElement);
      但是动态脚本标签插入与XHR相比只提供更少的控制。你不能通过请求发送信息头。参数只能通过GET方法传递,不能用POST。你不能设置请求的超时或重试,实际上,你不需要知道它是否失败了。你必须等待所有数据返回之后才可以访问它们。你不能访问响应信息头或者像访问字符串那样访问整个响应报文。
      最后一点非常重要。因为响应报文被用作脚本标签的源码,它必须是可执行的JavaScript。你不能使用裸XML,或者裸JSON,任何数据,无论什么格式,必须在一个回调函数之中被组装起来。
      var scriptElement = document.createElement('script');
      scriptElement.src = 'http://any-domain.com/javascript/lib.js';
      document.getElementsByTagName_r('head')[0].appendChild(scriptElement);
      function jsonCallback(jsonString) {
            var data = ('(' + jsonString + ')');
      }
      在这个例子中,lib.js 文件将调用jsonCallback 函数组装数据:
      jsonCallback({ "status": 1, "colors": [ "#fff", "#000", "#ff0000" ] });
      尽管有这些限制,此技术仍然非常迅速。其响应结果是运行JavaScript,而不是作为字符串必须被进一步处理。正因为如此,它可能是客户端上获取并解析数据最快的方法。我们比较了动态脚本标签插入和XHR的性能,在本章后面JSON 一节中。
      请小心使用这种技术从你不能直接控制的服务器上请求数据。JavaScript没有权限或访问控制的概念,所以你的页面上任何使用动态脚本标签插入的代码都可以完全控制整个页面。包括修改任何内容、将用户重定向到另一个站点,或跟踪他们在页面上的操作并将数据发送给第三方。使用外部来源的代码时务必非常小心。
      三、多部分XHR
      多部分XHR(MXHR)允许你只用一个HTTP 请求就可以从服务器端获取多个资源。它通过将资源(可以是CSS 文件,HTML 片段,JavaScript代码,或base64 编码的图片)打包成一个由特定分隔符界定的大字符串,从服务器端发送到客户端。JavaScript代码处理此长字符串,根据它的媒体类型和其他“信息头”解析出每个资源。
      让我们从头到尾跟随这个过程。首先,发送一个请求向服务器索取几个图像资源:
      var req = new XMLHttpRequest();
      req.open('GET', 'rollup_images.php', true);
      req.onreadystatechange = function() {
            if (req.readyState== 4) {
                  splitImages(req.responseText);
            }
      };
      req.send(null);
      这是一个非常简单的请求。你向rollup_images.php 要求数据,一旦你收到返回结果,就将它交给函数splitImages处理。
      下一步,服务器读取图片并将它们转换为字符串:
      $images = array('kitten.jpg', 'sunset.jpg', 'baby.jpg');
      foreach ($images as $image) {
            $image_fh = fopen($image, 'r');
            $image_data = fread($image_fh, filesize($image));
            fclose($image_fh);
            $payloads[] = base64_encode($image_data);
      }
      $newline = chr(1);
      echo implode($newline, $payloads);
      这段PHP代码读取三个图片,并将它们转换成base64字符串。它们之间用一个简单的字符,UNICODE的1,连接起来,然后返回给客户端。
      然后回到客户端,此数据由splitImage 函数处理:
      function splitImages(imageString) {
            var imageData = imageString.split("\u0001");
            var imageElement;
            for (var i = 0, len = imageData.length; i < len; i++) {
                  imageElement = document.createElement('img');
                  imageElement.src = 'data:image/jpeg;base64,' + imageData[i];
                  document.getElementById('container').appendChild(imageElement);
            }
      }
      此函数将拼接而成的字符串分解为三段。每段用于创建一个图像元素,然后将图像元素插入页面中。图像不是从base64 转换成二进制,而是使用data:URL 并指定image/jpeg 媒体类型。
      最终结果是:在一次HTTP 请求中向浏览器传入了三张图片。也可以传入20 张或100 张,响应报文会更大,但也只是一次HTTP 请求。它也可以扩展至其他类型的资源。JavaScript文件,CSS 文件,HTML片段,许多类型的图片都可以合并成一次响应。任何数据类型都可作为一个JavaScript处理的字符串被发送。下面的函数用于将JavaScript代码、CSS 样式表和图片转换为浏览器可用的资源:
      function handleImageData(data, mimeType) {
            var img = document.createElement('img');
            img.src = 'data:' + mimeType + ';base64,' + data;
            return img;
      }
      function handleCss(data) {
            var style = document.createElement('style');
            style.type = 'text/css';
            var node = document.createTextNode(data);
            style.appendChild(node);
            document.getElementsByTagName_r('head')[0].appendChild(style);
      }
      function handleJavaScript(data) {
            (data);
      }
      由于MXHR响应报文越来越大,有必要在每个资源收到时立刻处理,而不是等待整个响应报文接收完成。这可以通过监听readyState3 实现:
      var req = new XMLHttpRequest();
      var getLatestPacketInterval, lastLength = 0;
      req.open('GET', 'rollup_images.php', true);
      req.onreadystatechange = readyStateHandler;
      req.send(null);
      function readyStateHandler{
            if (req.readyState=== 3 && getLatestPacketInterval === null) {
                  getLatestPacketInterval = window.setInterval(function() {
                        getLatestPacket();
                  }, 15);
            }
            if (req.readyState=== 4) {
                  clearInterval(getLatestPacketInterval);
                  getLatestPacket();
            }
      }
      function getLatestPacket() {
            var length = req.responseText.length;
            var packet = req.responseText.substring(lastLength, length);
            processPacket(packet);
            lastLength = length;
      }
      当readyState3第一次发出时,启动了一个定时器。每隔15毫秒检查一次响应报文中的新数据。数据片段被收集起来直到发现一个分隔符,然后一切都作为一个完整的资源处理。以健壮的方式使用MXHR的代码很复杂但值得进一步研究。
      使用此技术有一些缺点,其中最大的缺点是以此方法获得的资源不能被浏览器缓存。如果你使用MXHR获取一个特定的CSS 文件然后在下一个页面中正常加载它,它不在缓存中。因为整批资源是作为一个长字符串传输的,然后由JavaScript代码分割。由于没有办法用程序将文件放入浏览器缓存中,所以用这种方法获取的资源也无法存放在那里。
      另一个缺点是:老版本的Internet Explorer不支持readyState3或data: URL。Internet Explorer 8两个都支持,但在Internet Explorer 6和7中必须设法变通。
      尽管有这些缺点,但某些情况下MXHR仍然显著提高了整体页面的性能:网页包含许多其他地方不会用到的资源(所以不需要缓存),尤其是图片。
      网站为每个页面使用了独一无二的打包的JavaScript或CSS文件以减少HTTP请求,因为它们对每个页面来说是独一的,所以不需要从缓存中读取,除非重新载入特定页面。
      由于HTTP请求是Ajax中最极端的瓶颈之一,减少其需求数量对整个页面性能有很大影响。尤其是当你将100个图片请求转化为一个MXHR请求时。Ad hoc 在现代浏览器上测试了大量图片,其结果显示出此技术比逐个请求快了4到10倍。
      有时你不关心接收数据,而只要将数据发送给服务器。你可以发送用户的非私有信息以备日后分析,或者捕获所有脚本错误然后将有关细节发送给服务器进行记录和提示。当数据只需发送给服务器时,有两种广泛应用的技术:XHR和灯标。
      (1) XMLHttpRequest
      虽然XHR主要用于从服务器获取数据,它也可以用来将数据发回。数据可以用GET或POST 方式发回,以及任意数量的HTTP 信息头。这给你很大灵活性。当你向服务器发回的数据量超过浏览器的最大URL长度时XHR特别有用。这种情况下,你可以用POST 方式发回数据:
      var url = '/data.php';
      var params = [
            'id=934875',
            'limit=20'
      ];
      var req = new XMLHttpRequest();
      req.onerror = function() {
            // Error.
      };
      req.onreadystatechange = function() {
            if (req.readyState== 4) {
                  // Success.
            }
      };
      req.open('POST', url, true);
      req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      req.setRequestHeader('Content-Length', params.length);
      req.send(params.join('&'));
      正如你在这个例子中看到的,如果失败了我们什么也不做。当我们用XHR捕获登陆用户统计信息时这么做通常没什么问题,但是,如果发送到服务器的是至关重要的数据,你可以添加代码在失败时重试:
      function xhrPost(url, params, callback) {
            var req = new XMLHttpRequest();
            req.onerror = function() {
                  setTimeout(function() {
                        xhrPost(url, params, callback);
                  }, 1000);
            };
            req.onreadystatechange = function() {
                  if (req.readyState== 4) {
                        if (callback && typeof callback === 'function') {
                             callback();
                        }
                  }
            };
            req.open('POST', url, true);
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            req.setRequestHeader('Content-Length', params.length);
            req.send(params.join('&'));
      }
      当使用XHR将数据发回服务器时,它比使用GET要快。这是因为对少量数据而言,向服务器发送一个GET请求要占用一个单独的数据包。另一方面,一个POST至少发送两个数据包,一个用于信息头。另一个用于POST体。POST更适合于向服务器发送大量数据,即因为它不关心额外数据包的数量,又因为Internet Explorer 的URL长度限制,它不可能使用过长的GET请求。
      (2) 灯标
      此技术与动态脚本标签插入非常类似。JavaScript用于创建一个新的Image 对象,将src 设置为服务器上一个脚本文件的URL。此URL 包含我们打算通过GET格式传回的键值对数据。注意并没有创建img 元素或者将它们插入到DOM 中。
      var url = '/status_tracker.php';
      var params = [
            'step=2',
            'time=1248027314'
      ];
      (new Image()).src = url + '?' + params.join('&');
      服务器取得此数据并保存下来,而不必向客户端返回什么,因此没有实际的图像显示。这是将信息发回服务器的最有效方法。其开销很小,而且任何服务器端错误都不会影响客户端。
      简单的图像灯标意味着你所能做的受到限制。你不能发送POST 数据,所以你被URL 长度限制在一个相当小的字符数量上。你可以用非常有限的方法接收返回数据。可以监听Image 对象的load 事件,它可以告诉你服务器端是否成功接收了数据。你还可以检查服务器返回图片的宽度和高度(如果返回了一张图片)并用这些数字通知你服务器的状态。例如,宽度为1 表示“成功”,2 表示“重试”。
      如果你不需要为此响应返回数据,那么你应当发送一个204 No Content 响应代码,无消息正文。它将阻止客户端继续等待永远不会到来的消息体:
      var url = '/status_tracker.php';
      var params = [
            'step=2',
            'time=1248027314'
      ];
      var beacon = new Image();
      beacon.src = url + '?' + params.join('&');
      beacon.onload = function() {
            if (this.width == 1) {
                  // Success.
            }
            else if (this.width == 2) {
                  // Failure; create another beacon and try again.
            }
      };
      beacon.onerror = function() {
            // Error; wait a bit, then create another beacon and try again.
      };
      灯标是向服务器回送数据最快和最有效的方法。服务器根本不需要发回任何响应正文,所以你不必担心客户端下载数据。唯一的缺点是接收到的响应类型是受限的。如果你需要向客户端返回大量数据,那么使用XHR。如果你只关心将数据发送到服务器端(可能需要极少的回复),那么使用图像灯标。

原创文章,转载请注明:  转载自 http://www.yiiyaa.net/

转载于:https://www.cnblogs.com/aaronjs/archive/2012/06/30/2570810.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向服务器请求数据的五种技术 的相关文章

  • 将文本大小调整为矩形 在 Canvas HTML5 中调整大小

    我是 Canvas 新手 我正在创建一个网站 以在调整矩形大小时增加文本 我尝试了很多 但没有任何效果 实际上 我希望如果我仅按其宽度调整矩形大小 向左拉伸 向右拉伸 则仅应增加文本宽度而不是字体大小 我已经完成了字体大小 但发现增加孤立文
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • 使用 DOJO 自动完成文本框

    我正在寻找一种使用 DOJO 进行文本框自动建议的简单方法 我将查询的数据库表 使用 PHP 脚本 以 JSON 形式返回 有超过 100 000 条记录 因此这确实不应该采用 FilteringSelect 或 ComboBox 的形式
  • 如何使用 Angular JS 单击时将 html 模板附加到 div/指令?

    我有这种情况
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • 了解 JavaScript - 资源

    使用 StackOverflow 的微型 Digit Blog 功能进行描述here https stackoverflow com about 我想发布以下我刚刚看到的 我觉得很有趣的谷歌技术谈话视频 我一直在理解 javascript
  • JSON-LD 缺少“}”或对象成员名称。错误

    我喜欢将 json ld 添加到我的网站 然后我想将它添加到我的开发网站来测试它 我收到错误消息 指出缺少 或对象成员名称 这是什么错误 我已正确关闭括号 如何修复它
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 在 React Navigation 中将 props 传递给自定义抽屉导航器

    在反应导航抽屉菜单中 我想显示用户名 John Doe 它处于我的主要组件的状态 Router 我怎样才能将自定义抽屉内容组件传递给它 额外信息 我从 AsyncStorage 中获取此名称 组件已挂载 这是我的代码 export defa
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • php 表单提交 - Q2

    我对这个虚拟问题感到抱歉 这是我的简单 PHP 表单 其中包含两个 SQL 表和 ADD 提交 按钮 我希望将人员从 Test1 转移到 Test2 很多事情都很好 只有提交按钮不起作用 因此 Test2 表没有反馈 Revised 现在提
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床
  • Flowtype 属性“msg”缺失为 null 或未定义

    我发现 Flow 很难用 我明白那个Array find可以返回或未定义 因此 通过阅读以下内容 github Array find on Array 引发 https github com facebook flow issues 351
  • Internet Explorer 9 是否会因数组和对象文字末尾的额外逗号而卡住?

    现代浏览器和 Node js 等环境允许您说 a 1 b 2 或 1 2 3 这在历史上一直是 Internet Explorer 的问题 Internet Explorer 9 中修复了此问题吗 对此有两种不同的答案 一种是对象初始值设定
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐

  • Hyperledger Fabric 应用实战(2)--网络节点设置

    1 网络节点设置 网络名称 rentnet 联盟组织 orderer排序组织 三个成员组织supervisor rentalcrop agency 通道 rentsign 账本数据库 couchdb 物理节点 组织 容器节点 supervi
  • 普通代码块,静态代码块,构造代码块,构造方法

    1 使用示例 2 静态代码块介绍 在类中通过static修饰然后大括号里面的内容就是静态代码块 见13 1实例 static 静态代码块在类被加载的时候执行 并且他只会执行一次 优先于其他所有代码块以及构造方法执行 如果有多个静态代码块则按
  • 怎么用电脑兼职赚钱,普通人可做的6个副业项目

    现在的生活中 我们总是感觉所过的日子都很紧张 虽然我们尽可能地工作和努力 但是生活成本和社会压力仍然那么大 为了弥补自己的生活经验和财务困难 很多人开始寻找一种额外的收入来源 其实这种额外的收入来源就被称之为 兼职或副业 在如今的经济环境中
  • 浅析数组名与&数组名的区别

    一 一维数组 我们借助sizeof帮助我们理解 运行结果如下 二 二维数组 同样借助sizeof来理解 运行结果如下 三 字符型数组 1 借助sizeof来理解 类似的 注意 a b数组有一些差别 造成这种差别的原因是b数组是字符串赋值 此
  • Liveness、Readiness 和 Startup Probes

    liveness apiVersion v1 kind Pod metadata labels test liveness name liveness exec spec containers name liveness image k8s
  • tomcat点击startup.bat一闪而退的解决方法

    1 点击startup bat会闪退 编辑startup bat 在最后一行加入pause 然后保存 再次运行 就可以看到闪退的原因 2 出现这个的原因是没有配置启动的环境JAVA HOME 下面配置一下JAVA HOME 右键电脑 点击属
  • mysql数据库优化--分区

    前言 公司业务数据量很大 因为是面向全国的数据统计分析 所以一天大约是大几十万数据 因为最开始设计架构没有参与 当系统出现问题 去查看的时候发现数据库两个表一个三亿多 另一个十一亿 1 优化思路 因为单表破亿执行sql现在都是问题了 del
  • sudo apt-get update 报错(Ubuntu20.04)

    1 错误 今天运行 sudo apt get update 时报错 appstreamcli 10947 GLib ERROR 09 43 36 719 g variant new parsed 11 13 invalid GVariant
  • 分巧克力 蓝桥杯 99

    题目描述 儿童节那天有 K 位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有 N 块巧克力 其中第 i 块是 Hi Wi 的方格组成的长方形 为了公平起见 小明需要从这N 块巧克力中切出 K 块巧克力分给小朋友们 切出的
  • OpenCV代码提取:dilate函数的实现

    Morphological Operations A set of operations that process images based on shapes Morphological operations apply a struct
  • 反汇编笔记

    1 OD中ctrl f9 运行到返回 就是运行到当前断点所在的函数末尾 retn xxx 处 若xxx 10 那么 10等于10进制的16 就是说这个函数有4个参数 一个参数默认是占4字节 所以就是retn 10 2 调试程序时 在OD内部
  • Windows-如何查看域用户的最终密码更改日期等详细信息

    有些公司的域用户密码是有期限的 比如1个月 3个月之类的 作为管理者或个人 你想查看自己或他人的域用户信息 比如上述的最终密码更改日期时间 就可以用下面这个命令 net user USERID domain 请把上面的红字改为你自己的用户名
  • 2022 ICPC Gran Premio de Mexico Repechaje 题解

    目录 A Average Walk 签到 题意 思路 代码 C Company Layoffs 签到 题意 思路 代码 D Denji1 模拟 二分 思路 代码 K Keypad Repetitions 签到 哈希 题意 思路 代码 L L
  • 【软件测试】备战秋招,数家公司的面经合集整理,总有一家你愿意去的,还不来赶紧学点经验。

    面经 前言 华为测试工程师 笔经 技术一面 技术二面 主管面 结果 大华测试 一面 二面 过了一两个小时就接到了 三面 下午3点接到hr电话 结果 中科创达 笔试 一面 技术面 二面 hr面 结果 恒生测试 安硕测试 恒生 安硕测试 深信服
  • java实现高校教务管理系统(带论文)

    xia基于java实现的高校教务管理系统 带论文 演示地址 教务系统登录 用户名 123456 密码 123456 论文 登录 学生管理 课程管理 学院管理 专业管理 下载地址 基于java实现的高校教务管理系统 带论文 源码世界
  • 以太坊私有链搭建

    https blog csdn net wxb880114 article details 79202378 以太坊私有链搭建
  • 包含中文的properties文件,第一行要空出来

    项目的配置文件中包含了中文 文件的编码格式为UTF 8 当读取properties文件时第一个Key总是失败 后面的Key则正常 Properties类API http docs oracle com javase 7 docs api j
  • setsockopt用法详解

    本文转载于 https www cnblogs com baiduboy p 8127913 html 最近做的一个程序用到了IOCP通信模型 里面用到了setsockopt对套接字进行设置 看源代码的时候最setsockopt函数很不理解
  • windows下用cygwin编译android版ijkplayer

    http blog csdn net ytzys article details 47302123
  • 向服务器请求数据的五种技术

    Ajax 在它最基本的层面 是一种与服务器通讯而不重载当前页面的方法 数据可从服务器获得或发送给服务器 有多种不同的方法构造这种通讯通道 每种方法都有自己的优势和限制 有五种常用技术用于向服务器请求数据 1 XMLHttpRequest X