<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

    Linux vmstat命令實(shí)戰(zhàn)詳解

      vmstat命令是最常見的Linux/Unix監(jiān)控工具,可以展現(xiàn)給定時(shí)間間隔的服務(wù)器的狀態(tài)值,包括服務(wù)器的CPU使用率,內(nèi)存使用,虛擬內(nèi)存交換情況,IO讀寫情況。這個(gè)命令是我查看Linux/Unix最喜愛的命令,一個(gè)是Linux/Unix都支持,二是相比top,我可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個(gè)進(jìn)程的CPU使用率和內(nèi)存使用率(使用場(chǎng)景不一樣)。
      一般vmstat工具的使用是通過(guò)兩個(gè)數(shù)字參數(shù)來(lái)完成的,第一個(gè)參數(shù)是采樣的時(shí)間間隔數(shù),單位是秒,第二個(gè)參數(shù)是采樣的次數(shù),如:
      root@ubuntu:~# vmstat 2 1
      procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
      r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
      1  0      0 3498472 315836 3819540    0    0     0     1    2    0  0  0 100  0
      2表示每個(gè)兩秒采集一次服務(wù)器狀態(tài),1表示只采集一次。
      實(shí)際上,在應(yīng)用過(guò)程中,我們會(huì)在一段時(shí)間內(nèi)一直監(jiān)控,不想監(jiān)控直接結(jié)束vmstat就行了,例如:
    root@ubuntu:~# vmstat 2
    procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
    1  0      0 3499840 315836 3819660    0    0     0     1    2    0  0  0 100  0
    0  0      0 3499584 315836 3819660    0    0     0     0   88  158  0  0 100  0
    0  0      0 3499708 315836 3819660    0    0     0     2   86  162  0  0 100  0
    0  0      0 3499708 315836 3819660    0    0     0    10   81  151  0  0 100  0
    1  0      0 3499732 315836 3819660    0    0     0     2   83  154  0  0 100  0
      這表示vmstat每2秒采集數(shù)據(jù),一直采集,直到我結(jié)束程序,這里采集了5次數(shù)據(jù)我就結(jié)束了程序。
      好了,命令介紹完畢,現(xiàn)在開始實(shí)戰(zhàn)講解每個(gè)參數(shù)的意思。
      r 表示運(yùn)行隊(duì)列(就是說(shuō)多少個(gè)進(jìn)程真的分配到CPU),我測(cè)試的服務(wù)器目前CPU比較空閑,沒(méi)什么程序在跑,當(dāng)這個(gè)值超過(guò)了CPU數(shù)目,就會(huì)出現(xiàn)CPU瓶頸了。這個(gè)也和top的負(fù)載有關(guān)系,一般負(fù)載超過(guò)了3就比較高,超過(guò)了5就高,超過(guò)了10就不正常了,服務(wù)器的狀態(tài)很危險(xiǎn)。top的負(fù)載類似每秒的運(yùn)行隊(duì)列。如果運(yùn)行隊(duì)列過(guò)大,表示你的CPU很繁忙,一般會(huì)造成CPU使用率很高。
      b 表示阻塞的進(jìn)程,這個(gè)不多說(shuō),進(jìn)程阻塞,大家懂的。
      swpd 虛擬內(nèi)存已使用的大小,如果大于0,表示你的機(jī)器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因,那么你該升級(jí)內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機(jī)器。
      free   空閑的物理內(nèi)存的大小,我的機(jī)器內(nèi)存總共8G,剩余3415M。
      buff   Linux/Unix系統(tǒng)是用來(lái)存儲(chǔ),目錄里面有什么內(nèi)容,權(quán)限等的緩存,我本機(jī)大概占用300多M
      cache cache直接用來(lái)記憶我們打開的文件,給文件做緩沖,我本機(jī)大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內(nèi)存的一部分拿來(lái)做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當(dāng)程序使用內(nèi)存時(shí),buffer/cached會(huì)很快地被使用。)
      si  每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個(gè)值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進(jìn)程解決掉。我的機(jī)器內(nèi)存充裕,一切正常。
      so  每秒虛擬內(nèi)存寫入磁盤的大小,如果這個(gè)值大于0,同上。
      bi  塊設(shè)備每秒接收的塊數(shù)量,這里的塊設(shè)備是指系統(tǒng)上所有的磁盤和其他塊設(shè)備,默認(rèn)塊大小是1024byte,我本機(jī)上沒(méi)什么IO操作,所以一直是0,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機(jī)器上看過(guò)可以達(dá)到140000/s,磁盤寫入速度差不多140M每秒
      bo 塊設(shè)備每秒發(fā)送的塊數(shù)量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過(guò)于頻繁,需要調(diào)整。
      in 每秒CPU的中斷次數(shù),包括時(shí)間中斷
      cs 每秒上下文切換次數(shù),例如我們調(diào)用系統(tǒng)函數(shù),就要進(jìn)行上下文切換,線程的切換,也要進(jìn)程上下文切換,這個(gè)值要越小越好,太大了,要考慮調(diào)低線程或者進(jìn)程的數(shù)目,例如在apache和nginx這種web服務(wù)器中,我們一般做性能測(cè)試時(shí)會(huì)進(jìn)行幾千并發(fā)甚至幾萬(wàn)并發(fā)的測(cè)試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線程的峰值一直下調(diào),壓測(cè),直到cs到一個(gè)比較小的值,這個(gè)進(jìn)程和線程數(shù)就是比較合適的值了。系統(tǒng)調(diào)用也是,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會(huì)進(jìn)入內(nèi)核空間,導(dǎo)致上下文切換,這個(gè)是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)。上下文切換次數(shù)過(guò)多表示你的CPU大部分浪費(fèi)在上下文切換,導(dǎo)致CPU干正經(jīng)事的時(shí)間少了,CPU沒(méi)有充分利用,是不可取的。
      us 用戶CPU時(shí)間,我曾經(jīng)在一個(gè)做加密解密很頻繁的服務(wù)器上,可以看到us接近100,r運(yùn)行隊(duì)列達(dá)到80(機(jī)器在做壓力測(cè)試,性能表現(xiàn)不佳)。
      sy 系統(tǒng)CPU時(shí)間,如果太高,表示系統(tǒng)調(diào)用時(shí)間長(zhǎng),例如是IO操作頻繁。
      id  空閑 CPU時(shí)間,一般來(lái)說(shuō),id + us + sy = 100,一般我認(rèn)為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統(tǒng)CPU使用率。
      wt 等待IO CPU時(shí)間。

    posted @ 2014-08-28 10:29 順其自然EVO 閱讀(193) | 評(píng)論 (0)編輯 收藏

    數(shù)據(jù)庫(kù)異常hang住解決

     下午內(nèi)網(wǎng)測(cè)試庫(kù)同事反應(yīng)查詢更新數(shù)據(jù)很慢,有時(shí)甚至表都打不開,后來(lái)通過(guò)服務(wù)器【linux】的top命令查看了下,cpu和mem占用正常,但wait高達(dá)80%多(下面兩圖顯示的就是問(wèn)題前后觀察EM對(duì)比的截圖,版本是oracle10gR2,EM的效果比oracle11gR2遜色不少哈):
      -------------------------------------->>
      ---------------------------->>
      接著通過(guò)sqldevelpdev客戶端查詢有沒(méi)有鎖等待之類會(huì)話事件,果然有,而且是兩個(gè)session持有TX鎖,然后通過(guò)下面的sql查詢從oracle和linux級(jí)別kill掉了相應(yīng)session,以為風(fēng)波就此平靜,結(jié)果過(guò)了不到一分鐘查詢又出現(xiàn),只不過(guò)這次只有一個(gè)session持有TX鎖,于是就去查找對(duì)應(yīng)的sql_txt,找到后發(fā)現(xiàn)是個(gè)同事寫的存儲(chǔ)過(guò)程,定時(shí)任務(wù),當(dāng)時(shí)正在運(yùn)行,讓其確認(rèn)下是不是任務(wù)執(zhí)行出問(wèn)題了,結(jié)果一查,是程序問(wèn)題,造成的死循環(huán),它會(huì)批量發(fā)起會(huì)話,kill一個(gè)后接著又鎖,循環(huán)反復(fù),后來(lái)他改了下程序后重新運(yùn)行,一切恢復(fù)通暢.
    --查詢死鎖
    select sess.sid, sess.serial#,  lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode
    from v$locked_object lo, dba_objects ao,v$session sess
    where ao.object_id = lo.object_id and lo.session_id = sess.sid;
    --oracle級(jí)別kill session
    alter system kill session '1627,1';
    alter system kill session '1564,64740';
    --查詢當(dāng)前連接會(huì)話
    select s.value,s.sid,a.username,a.MACHINE from v$sesstat S,v$statname N,v$session A
    where n.statistic#=s.statistic# and name='session pga memory' and s.sid=a.sid and a.sid=1626
    order by s.value;
    --查詢?cè)斐伤梨i的sql語(yǔ)句
    SELECT   a.SID, a.username, s.sql_text FROM v$session a, v$sqltext s
    WHERE a.sql_address = s.address AND a.sql_hash_value = s.hash_value  and a.SID=1626
    ORDER BY a.username, a.SID, s.piece;
    --造成鎖等待的操作內(nèi)容
    begin
    flt_com.p_line_relation_change(:A0,:B0,:C0,:D0,:E0,:ret_errorcode,:ret_errorname);
    end;
    --通過(guò)sid查找pid,進(jìn)而通過(guò)系統(tǒng)級(jí)別kill
    select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=1605;
    --服務(wù)器級(jí)別kill
    kill -9 spid
    --------------------------------over game

    posted @ 2014-08-28 10:19 順其自然EVO 閱讀(404) | 評(píng)論 (0)編輯 收藏

    Java中的環(huán)境變量設(shè)置---理解

     java中環(huán)境變量的設(shè)置,主要是設(shè)置設(shè)置JAVA_HOME,CLASSPATH,在path變量中增加java的bin目錄。當(dāng)然現(xiàn)在都是用工具開發(fā),可以不設(shè)置CLASSPATH,可能會(huì)有問(wèn)題,所以還是盡量設(shè)置、
      JAVA_HOME
      C:\Java\jdk1.6.0_30(java的安裝目錄,)
      PATH
      C:\Java\jdk1.6.0_30\bin(%JAVA_HOME%\lib)(不要新建path在原來(lái)的path路徑上新加java到bin的路徑就可以了,)
      CLASSPATH
      .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注前面的點(diǎn)號(hào)和分號(hào)一定不能丟,還有中間的,后面的分號(hào)也不要丟了)
      說(shuō)明:CLASSPATH可以再增加一些第三方的jar文件,方便手工編譯和運(yùn)行程序。
      ***********************************************************
      在windows中查看環(huán)境變量,用set,要查看某一個(gè)環(huán)境變量的值,可以用set后面跟要查看的值,比如:set classpath ,查看path變量的話,可以直接輸入path就可以了。
      設(shè)置環(huán)境變量,可以用set ,比如  set classpath=“新的路徑”; 這樣就可以了,但只是臨時(shí)的,doc窗口關(guān)閉的時(shí)候,設(shè)置的臨時(shí)環(huán)境變量就不存在了。

    posted @ 2014-08-28 10:12 順其自然EVO 閱讀(190) | 評(píng)論 (0)編輯 收藏

    數(shù)據(jù)庫(kù)異常hang住解決

    下午內(nèi)網(wǎng)測(cè)試庫(kù)同事反應(yīng)查詢更新數(shù)據(jù)很慢,有時(shí)甚至表都打不開,后來(lái)通過(guò)服務(wù)器【linux】的top命令查看了下,cpu和mem占用正常,但wait高達(dá)80%多(下面兩圖顯示的就是問(wèn)題前后觀察EM對(duì)比的截圖,版本是oracle10gR2,EM的效果比oracle11gR2遜色不少哈):
      -------------------------------------->>
      ---------------------------->>
      接著通過(guò)sqldevelpdev客戶端查詢有沒(méi)有鎖等待之類會(huì)話事件,果然有,而且是兩個(gè)session持有TX鎖,然后通過(guò)下面的sql查詢從oracle和linux級(jí)別kill掉了相應(yīng)session,以為風(fēng)波就此平靜,結(jié)果過(guò)了不到一分鐘查詢又出現(xiàn),只不過(guò)這次只有一個(gè)session持有TX鎖,于是就去查找對(duì)應(yīng)的sql_txt,找到后發(fā)現(xiàn)是個(gè)同事寫的存儲(chǔ)過(guò)程,定時(shí)任務(wù),當(dāng)時(shí)正在運(yùn)行,讓其確認(rèn)下是不是任務(wù)執(zhí)行出問(wèn)題了,結(jié)果一查,是程序問(wèn)題,造成的死循環(huán),它會(huì)批量發(fā)起會(huì)話,kill一個(gè)后接著又鎖,循環(huán)反復(fù),后來(lái)他改了下程序后重新運(yùn)行,一切恢復(fù)通暢.
    --查詢死鎖
    select sess.sid, sess.serial#,  lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode
    from v$locked_object lo, dba_objects ao,v$session sess
    where ao.object_id = lo.object_id and lo.session_id = sess.sid;
    --oracle級(jí)別kill session
    alter system kill session '1627,1';
    alter system kill session '1564,64740';
    --查詢當(dāng)前連接會(huì)話
    select s.value,s.sid,a.username,a.MACHINE from v$sesstat S,v$statname N,v$session A
    where n.statistic#=s.statistic# and name='session pga memory' and s.sid=a.sid and a.sid=1626
    order by s.value;
    --查詢?cè)斐伤梨i的sql語(yǔ)句
    SELECT   a.SID, a.username, s.sql_text FROM v$session a, v$sqltext s
    WHERE a.sql_address = s.address AND a.sql_hash_value = s.hash_value  and a.SID=1626
    ORDER BY a.username, a.SID, s.piece;
    --造成鎖等待的操作內(nèi)容
    begin
    flt_com.p_line_relation_change(:A0,:B0,:C0,:D0,:E0,:ret_errorcode,:ret_errorname);
    end;
    --通過(guò)sid查找pid,進(jìn)而通過(guò)系統(tǒng)級(jí)別kill
    select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=1605;
    --服務(wù)器級(jí)別kill
    kill -9 spid
    --------------------------------over game

    posted @ 2014-08-28 10:12 順其自然EVO 閱讀(179) | 評(píng)論 (0)編輯 收藏

    兩款REST測(cè)試工具

      用CURL命令行測(cè)試REST API 無(wú)疑是低效率的,這里把最近使用的兩款 Chrome 插件總結(jié)下
      POSTMAN
      簡(jiǎn)單易用
      REST Console
      功能強(qiáng)大
      使用的話用POSTMAN就夠用了,但是我更喜歡 REST Console ,因?yàn)樗墓δ芊浅?qiáng)大和全面,一下子就能讓你搞清楚你在做的事情,你用不到的功能也可以幫助你更加了解 REST, http請(qǐng)求的過(guò)程。
      下面是兩個(gè)的截圖界面
      1. POSTMAN 測(cè)試工具
      1. Authorization
      Basic Auth
      Digest Auth
      OAuth 1.0
      2. REQUEST METHOD
      GET, PUT, POST, PATCH, DELETE, LINK, UNLINK, COPY, HEAD, OPTIONS, PURGE
      3. Request Headers
    Content-Type:
    form-data
    x-www-form-urlencoded
    raw
    Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryVQuD0ghtRqDehBQH
    Request Payload:
    ------WebKitFormBoundaryVQuD0ghtRqDehBQH
    Content-Disposition: form-data; name="image"
    dddddd
    ------WebKitFormBoundaryVQuD0ghtRqDehBQH--
    Content-Type:application/x-www-form-urlencoded
    Form Data:
    image:bbbbbbb
    Content-Type:text/plain;charset=UTF-8
    Request Payload:
    image=aaaaaaaaaaaaaa
      這3種方法其中 form-data 是不支持 PUT 方法的。而用REST Console中的 Content-Type:multpart/form-data 是支持 PUT 方法的。不知道是不是bug
      4. Response Body
      支持3種展示方式, 以及常用的XML和JSON格式。
      Pretty
      Raw
      Preview
      JSON/XML
      5. Response Header
    Connection →
    Connection
    Options that are desired for the connection
    Keep-Alive
    Content-Length →93
    Content-Type →application/json; charset=UTF-8
    Date →Fri, 01 Aug 2014 05:41:56 GMT
    Keep-Alive →timeout=5, max=100
    Server →Apache/2.2.9 (Win32) PHP/5.4.30 mod_fcgid/2.3.6
    X-Powered-By →PHP/5.4.30
     2. REST Console 測(cè)試工具
      1. Options
      軟件相關(guān)設(shè)置,配色,主題,高亮設(shè)置等(說(shuō)明這個(gè)東東功能比較全面)
      特別說(shuō)下一個(gè)選項(xiàng)就是 Help Lines, 開啟這個(gè)選項(xiàng),對(duì)著 REST Console的每一個(gè)選項(xiàng),就很容易搞清楚 http 的 請(qǐng)求和響應(yīng)中的每一個(gè)項(xiàng)目是怎么回事
      原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明 : http://www.cnblogs.com/ganiks/
      2. Target
      設(shè)置下面內(nèi)容:
    Target
    Request URI : 這個(gè)是請(qǐng)求的 URI
    Request Method : PUT POST ...
    Request Timeout
    Accept
    Accept: (注意區(qū)分這個(gè)type和后面的content-type)
    */*(一般都是這個(gè)選項(xiàng))
    application/atom+xml
    test/plain
    application/javascript
    application/json
    application/http
    application/pdf
    application/rar
    ... ...
    Acceptable Language
      3. Body
      Content Headers
      Content-Type: mime type of the request body(跟PUT和POST方法配合使用)
      application/x-www-form-urlencoded
      text/plain
      multipart/form-data
      這3種是在 POSTMAN中支持的3種,但其實(shí)有很多很多種,在 REST Console 中的輸入框中輸入幾個(gè)字母,會(huì)自動(dòng)匹配庫(kù)中的很多選項(xiàng)
      Acceptable Encoding: 比如 utf-8(參考 HTTP compression)
      Content-MD5: 比如 Q2hlY2sgSW50ZWdyaXR5IQ==
      Request Payload
      RAW BODY: image=ccccccccc
      Request Params: key=>value
      Attachements: upload files
      Custom Headers
      Request Parameters
      對(duì)照個(gè)例子:
    Accept:*/*
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    Authorization:Basic MTAwLXRva2VuOg==
    Cache-Control:no-cache
    Connection:keep-alive
    Content-Length:20
    Content-Type:text/plain;charset=UTF-8
    Host:192.168.4.126
    Origin:chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
    User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
      4. Authorization
      Basic Auth
      Setup oAuth
      Refresh oAuth
      5. Headers
      Headers
      Max-Forwards: 10 (限制消息可以穿破 的代理和網(wǎng)關(guān)的層數(shù))
      Range
      From: (發(fā)送消息者的郵件地址)
      Warning
      Pragma
      ...
      Cache (內(nèi)容太多了)
      Common non-standard request headers
      6. Response
    Response Body: 支持 JSON XML HTML CSS 等高亮格式
    {
    "id": "162",
    "image": "cccccccc",
    "link": "dd2",
    "show_date": "0000-00-00",
    "state": 1,
    "show_order": 0
    }
    RAW Body
    {"id":"162","image":"cccccccc","link":"dd2","show_date":"0000-00-00","state":1,"show_order":0}
    Response Headers
    Status Code: 200
    Date: Fri, 01 Aug 2014 06:39:00 GMT
    Server: Apache/2.2.9 (Win32) PHP/5.4.30 mod_fcgid/2.3.6
    Connection: Keep-Alive
    X-Powered-By: PHP/5.4.30
    Content-Length: 94
    Keep-Alive: timeout=5, max=100
    Content-Type: application/json; charset=UTF-8
    Response Preview
    Request Body
    Request Url: http://192.168.4.126/news/162
    Request Method: PUT
    Status Code: 200
    Params: {}
    Request Headers
    Content-Type: multipart/form-data
    Authorization: Basic MTAwLXRva2VuOg==
    Accept: */*
    Connection: keep-alive
    Origin: chrome-extension: //rest-console-id
    User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
      3. http請(qǐng)求的Accept參數(shù)
      上面提到了一個(gè)設(shè)置的地方, Accept 和 Content-Type
      這兩個(gè)參數(shù)很重要
      前者一般如果不設(shè)置默認(rèn)的是 */*, POSTMAN 和 RESTConsole 工具中默認(rèn)的是 application/json,因此在不設(shè)置 Headers:Accept 參數(shù)的情況下返回的按照 json格式;
      而普通的瀏覽器中返回的則默認(rèn)是 application/xml 格式。
      后者這個(gè) type 指的是head body 內(nèi)容的 類型
      這就是為什么這兩個(gè)參數(shù)分別被 REST Console 工具分別放在了 2. Target 3. Body 中。
      在 yii 中默認(rèn)支持的 rest api 格式有 xml 和 JSON, yii 會(huì)根據(jù) 請(qǐng)求的 head 的 Accept 參數(shù)來(lái)返回對(duì)應(yīng)格式的數(shù)據(jù)。
      這個(gè)參數(shù) 在chrome 中可以修改默認(rèn)值嗎?

    posted @ 2014-08-28 09:46 順其自然EVO 閱讀(7086) | 評(píng)論 (0)編輯 收藏

    Eclipse中使用Junit編寫測(cè)試用例

    Eclipse自帶Junit插件,不用安裝就能在項(xiàng)目中編寫測(cè)試用例,非常方便。
      在項(xiàng)目中添加Junit庫(kù)
      在編寫測(cè)試用例之前,需要先引入Junit。對(duì)項(xiàng)目根目錄右鍵,選擇Properties,Java Build Path,Libraries,如圖:
      Add Library,選擇Junit:
      點(diǎn)Next選擇Junit版本,然后Finish就完成了引入。
      編寫測(cè)試用例
      假設(shè)有如下類:
      package choon.test;
      public class Calculate {
      public int  Add(int x,int y) {
      return x + y;
      }
      }
      可以編寫測(cè)試用例如下:
    package choon.test;
    import static org.junit.Assert.*;
    import org.junit.Test;
    public class Test1 {
    @Test
    public void test() {
    Calculate calculate = new Calculate();
    assertEquals(8, calculate.Add(3, 5));
    }
    }
      對(duì)test方法右鍵Run As Junit Test即可運(yùn)行該測(cè)試用例:
      如圖,綠色狀態(tài)條表示測(cè)試通過(guò),如果是紅色,則表示沒(méi)有通過(guò)。
    before和after標(biāo)簽
      被before標(biāo)記的方法在每個(gè)測(cè)試用例執(zhí)行之前執(zhí)行,被after標(biāo)記的方法在每個(gè)測(cè)試用例執(zhí)行后執(zhí)行。
      假如編寫如下測(cè)試用例:
    package choon.test;
    import static org.junit.Assert.*;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    public class Test1 {
    @Before
    public void setUp() {
    System.out.println("---begin test---");
    }
    @Test
    public void test() {
    Calculate calculate = new Calculate();
    assertEquals(8, calculate.Add(3, 5));
    System.out.println("test case");
    }
    @After
    public void tearDown() {
    System.out.println("---end test---");
    }
    }
      則會(huì)有下面的執(zhí)行結(jié)果:
      測(cè)試用例的編寫很重要,一個(gè)不好的測(cè)試用例既起不到測(cè)試作用又浪費(fèi)時(shí)間,而一個(gè)好的測(cè)試用例可以很好的指出代碼中的問(wèn)題,避免更大的麻煩。
     
     

    posted @ 2014-08-28 09:42 順其自然EVO 閱讀(1570) | 評(píng)論 (0)編輯 收藏

    Windows下使用skipfish

    skipfishGoogle的工程師MIchal Zalewski開發(fā)的另一款網(wǎng)站安全檢測(cè)工具,它完全實(shí)現(xiàn)了全自動(dòng)化操作,所以不需要人工干預(yù),這一點(diǎn)上比RatProxy要好用一些,當(dāng)然在功能上也強(qiáng)大更多了。
      可以從http://code.google.com/p/skipfish/下載它。
      安裝Cygwin
      與ratproxy一樣,在windows下需要安裝cygwin才能編譯它。
      下載Cygwin(http://www.cygwin.com/),一路默認(rèn)下一步直到選擇下載站點(diǎn),考慮到國(guó)外的源速度比較慢,所以選擇從ntu.edu.tw(速度還是不錯(cuò)的)下載;然后下一步Select Packages,找到以下幾個(gè)包,并安裝它們:
      gcc
      make
      libidn-devel
      zlib-devel
      openssl-devel
      繼續(xù)下一步直至安裝完成。
      生成skipfish
      1、下載skipfish
      2、運(yùn)行cygwin.bat,并切換到skipfish所在目錄(cd “c:\skipfish”)
      3、運(yùn)行make,等它編譯完成
      使用skipfish
      在命令行輸入以下命令:
      skipfish –o log –W “dictionaries/complete.wl” http://lwme.cnblogs.com
      -o參數(shù)是輸出目錄,-W是選擇字典,然后就等著它掃描完看報(bào)告吧。
      使用它的默認(rèn)參數(shù)掃描起來(lái)是相當(dāng)慢的,所以如果有需要的話,可以通過(guò)-h參數(shù)或者它的在線文檔:http://code.google.com/p/skipfish/wiki/SkipfishDoc去研究它。

    posted @ 2014-08-28 09:35 順其自然EVO 閱讀(257) | 評(píng)論 (0)編輯 收藏

    自動(dòng)化測(cè)試成本與收益

      在測(cè)試領(lǐng)域,很多的測(cè)試從業(yè)人員都在討論或者曾經(jīng)討論過(guò)自動(dòng)化測(cè)試。支持者認(rèn)為自動(dòng)化能夠提高測(cè)試效率,減少枯燥繁瑣的用例執(zhí)行。持反對(duì)意見人的當(dāng)心自動(dòng)化測(cè)試的引入成本太大,反而沒(méi)有手工測(cè)試來(lái)的高效。更有人當(dāng)心自動(dòng)化測(cè)試無(wú)法保證軟件的質(zhì)量,其實(shí)能否保證軟件的質(zhì)量,不是由自動(dòng)化測(cè)試決定,而是取決于你的用例的設(shè)計(jì)。對(duì)于新的事物,在沒(méi)有任何實(shí)踐的基礎(chǔ)上不能輕易地下結(jié)論,因?yàn)槊總€(gè)人都有慣性的思維,有時(shí)候很難跳出固有的思維去考慮新的事物。
      自動(dòng)化測(cè)試本身作為一種測(cè)試的手段不存在任何的問(wèn)題。它的好與壞,本質(zhì)是由其最終結(jié)果來(lái)決定的。如果自動(dòng)化測(cè)試帶來(lái)收益大于我們投入的成本,那么自動(dòng)化測(cè)試就是成功的。我們要做的就是在自動(dòng)化測(cè)試實(shí)施過(guò)程中去提高我們的收益,去降低我們的成本。
      何為自動(dòng)化測(cè)試?自動(dòng)化測(cè)試是希望能夠通過(guò)自動(dòng)化測(cè)試工具或其他手段,按照測(cè)試工程師的預(yù)定計(jì)劃進(jìn)行自動(dòng)的測(cè)試。目的是減輕手工測(cè)試的勞動(dòng)量,騰出更多的時(shí)間和精力去測(cè)試重要模塊,同時(shí)又保證已有覆蓋自動(dòng)化測(cè)試的模塊的質(zhì)量,從而達(dá)到提高軟件質(zhì)量的目的。自動(dòng)化測(cè)試的目的在于發(fā)現(xiàn)原有模塊引入的新缺陷,保證已有功能的質(zhì)量。
      自動(dòng)化測(cè)試開展的前提
      首先部門或者公司要從管理層次上支持你,其次要有專門的測(cè)試團(tuán)隊(duì)去建立適合自動(dòng)化測(cè)試的測(cè)試流程、測(cè)試體系,排除上面的因數(shù)之外我總結(jié)了自動(dòng)化測(cè)試一些前提條件。
      1.      長(zhǎng)期性
      指的是被測(cè)產(chǎn)品(或功能)是否需要一個(gè)長(zhǎng)期的維護(hù),因?yàn)槎唐诘捻?xiàng)目是沒(méi)有實(shí)現(xiàn)自動(dòng)化測(cè)試的必要的,短期的項(xiàng)目很明顯他的投入成本肯定大于其收益。
      2.      穩(wěn)定性
      被測(cè)產(chǎn)品(或功能)是否有一個(gè)相對(duì)穩(wěn)定的產(chǎn)品。如果功能和界面都處于不穩(wěn)定階段而且經(jīng)常發(fā)生變化的,那腳本和用例的維護(hù)成本是非常高的,
      所以也是不具備實(shí)施自動(dòng)化的前提條件。
      3.      合適測(cè)試工具
      (工欲善其事,必先利其器)
      假如被測(cè)產(chǎn)品(或功能)難以通過(guò)工具識(shí)別其控件的話
      假如使用腳本語(yǔ)言難懂難學(xué),而且擴(kuò)展性差。
      4.      人員
      你的產(chǎn)品組內(nèi)是否具備合適人員去開展自動(dòng)化,是否具備一定合適的人去做自動(dòng)化腳本開發(fā)。自動(dòng)化測(cè)試實(shí)施的好與壞,很大程度上取決于該測(cè)試工程師,因?yàn)橐行?shí)施自動(dòng)化測(cè)試,單一的測(cè)試工具的熟練是遠(yuǎn)遠(yuǎn)不夠的,他需要其它一些輔助的測(cè)試手段,所以同時(shí)也就需要該測(cè)試工程師具備一定的方案解決能力,能夠找到較優(yōu)的方案來(lái)解決現(xiàn)實(shí)中碰到的問(wèn)題。
      5.      用例
      自動(dòng)化測(cè)試需要好的測(cè)試用例的輔助,這個(gè)應(yīng)該是大家的共識(shí),所以不展開來(lái)講。所以這里希望我們的自動(dòng)化測(cè)試工程師需要與用例設(shè)計(jì)者進(jìn)行密切的合作。
      整體來(lái)說(shuō)自動(dòng)化測(cè)試能否有效開展,能否有效的實(shí)施,不是單一取決于某一個(gè)人或者某自動(dòng)化測(cè)試工程師的能力,他是整個(gè)團(tuán)隊(duì)合作的結(jié)果。
      自動(dòng)化測(cè)試成本
      這是領(lǐng)導(dǎo)們最關(guān)心的問(wèn)題。因?yàn)樗麄兌枷M詣?dòng)化測(cè)試帶來(lái)的收益要遠(yuǎn)大于所投入的成本。不然怎么體現(xiàn)自動(dòng)化測(cè)試價(jià)值?如果沒(méi)有價(jià)值還不如直接手工測(cè)試來(lái)的干脆。
      那么自動(dòng)化成本有哪些?
      1、調(diào)研成本
      2、腳本開發(fā)維護(hù)成本
      3、自動(dòng)化用例設(shè)計(jì)與維護(hù)成本
      4、資源投入成本
     如何有效的降低自動(dòng)化測(cè)試成本呢?
      一、     提高調(diào)研成本,減少人為因數(shù)成本
      調(diào)研成本省不了,而且要加大投入,如果投入成本不大,選擇的工具和框架都不適合自動(dòng)化的開展,那么自動(dòng)化測(cè)試肯定以失敗告終。一旦給自動(dòng)化測(cè)試選好了型,后期的轉(zhuǎn)化成本非常的高,所以一開始就要選擇合適的工具和框架。
      當(dāng)然為了盡量減少調(diào)研成本,需要選擇合適人,需要整個(gè)團(tuán)隊(duì)的配合。
      二、     選擇好的測(cè)試工具
      選擇好的測(cè)試工具,首先要看其所使用的語(yǔ)言是否容易普及,是否功能強(qiáng)大,在自動(dòng)化測(cè)試工具當(dāng)中,我認(rèn)為最重要的是GUI對(duì)象的識(shí)別能力,第三方接口的處理能力。
      三、     構(gòu)建合適的測(cè)試框架
      有了好的測(cè)試工具之后,我們需要一個(gè)合適的測(cè)試框架,測(cè)試框架應(yīng)該是一個(gè)企業(yè)級(jí)的應(yīng)用,而不是單一的產(chǎn)品和功能。它至少可以減少重復(fù)代碼編寫,包含常用的操作,簡(jiǎn)單的配置或自動(dòng)配置,運(yùn)行結(jié)果自動(dòng)收集,運(yùn)行結(jié)果簡(jiǎn)潔且容易分析。
      四、     選擇合適的人,減少研究,實(shí)施投入成本
      這里我主要講是選擇合適的人,做正確的事上。那么什么樣的人適合做自動(dòng)化測(cè)試呢,首先的一點(diǎn)肯定要有一定的代碼編寫能力。其次我覺(jué)得需要一定軟件工程的思想。沒(méi)有好的思想,是很難組織起清晰架構(gòu)的代碼來(lái)的。
      合適人,做正確的事。這里就充分體現(xiàn)管理者能力了,尤其是測(cè)試框架上的研究,往往不是靠單一的人所能夠做到,因?yàn)闀?huì)受到知識(shí)體系,思維,能力等相關(guān)的束縛。所以我的意見是這些應(yīng)該是交給一個(gè)組織,該組織內(nèi)集合測(cè)試負(fù)責(zé)人,測(cè)試工程師,自動(dòng)化測(cè)試工程師,來(lái)依靠團(tuán)隊(duì)的力量來(lái)打造合適的測(cè)試框架。當(dāng)然框架的實(shí)現(xiàn)上應(yīng)該交給自動(dòng)化測(cè)試工程師。
      那么什么樣的人才是合適的呢
      1、需要有一定的手工測(cè)試經(jīng)驗(yàn)和自動(dòng)化測(cè)試經(jīng)驗(yàn),能知道測(cè)試框架為誰(shuí)而做,需要做什么?
      2、能夠?qū)?fù)雜的設(shè)計(jì)簡(jiǎn)單化,能夠充分理解軟件工程的思想,將最簡(jiǎn)單的應(yīng)用提供給測(cè)試工程師
      五、     減少用例的設(shè)計(jì)維護(hù)成本
      如果有好的框架支撐的話,那么用例的設(shè)計(jì)維護(hù)成本完全是可以減少的。
      六、     保持腳本整體架構(gòu)清晰易懂,易維護(hù)
      七、     合適的加大資源投入成本
      我覺(jué)得資源投入成本是值得的,資源投入如果能夠減少人力的投入的話。我想是所有管理者都愿意看到的。
      自動(dòng)化測(cè)試收益
      在如何評(píng)價(jià)自動(dòng)化測(cè)試收益方面,每個(gè)人的角度不通過(guò),得出結(jié)果可能也不相同。我想從以下幾個(gè)方面來(lái)看自動(dòng)化收益:
      1、快速測(cè)試
      測(cè)試人員手工測(cè)試多個(gè)功能,測(cè)試執(zhí)行的并行度總有個(gè)上限。而多個(gè)并行執(zhí)行的自動(dòng)化測(cè)試腳本可以更快速地驗(yàn)證版本,一次性地報(bào)告問(wèn)題
      2、降低手工測(cè)試投入成本
      將功能測(cè)試人員從繁瑣重復(fù)的測(cè)試中解脫出來(lái),有更多的時(shí)間和精力去進(jìn)行一些探索性的測(cè)試。
      3、提供了軟件的質(zhì)量
      自動(dòng)化測(cè)試能夠幫助我們減少生產(chǎn)環(huán)境中某種特定類型的缺陷。這些缺陷包括環(huán)境或者配置相關(guān)的缺陷、在主流程上本來(lái)正常但因?yàn)楹笃谛薷挠绊懙降墓δ堋⒁约叭菀妆缓雎缘牡胤降?/div>
      4、提高了我們對(duì)軟件質(zhì)量的信心
      5、自動(dòng)化測(cè)試可以喚起更高的工作熱情
      這一方面來(lái)自于可以部分地將測(cè)試人員從大量重復(fù)的測(cè)試執(zhí)行中解放出來(lái),另一方面來(lái)自于新技術(shù)、新工具帶來(lái)的新鮮感
      如何有效地提高自動(dòng)化測(cè)試收益?
      要有效的開展自動(dòng)化,一定程度上來(lái)說(shuō),成本是很難降低的,只有將收益最大化。增加收益的方式有很多種:
      一、提高自動(dòng)化測(cè)試迭代次數(shù),提高自動(dòng)化的使用頻率
      要提高自動(dòng)化的使用頻率,就需要將原有觀念自動(dòng)化測(cè)試收益往往來(lái)源于回歸階段進(jìn)行更正,實(shí)際證明自動(dòng)化同樣可以在日常測(cè)試中發(fā)揮作用。自動(dòng)化的使用用例的重復(fù)性使用頻率越高,其價(jià)值也就越大,其收益也會(huì)越大。
      二、腳本復(fù)用,提高腳本對(duì)應(yīng)功能點(diǎn)的用例覆蓋率
      提高該腳本所覆蓋功能點(diǎn)的用例覆蓋,也就是我們不但要考慮減少了自動(dòng)化腳本開發(fā)成本以及降低維護(hù)成本,同時(shí)也要考慮該腳本帶來(lái)的收益已盡量去最大化。
      三、提高自動(dòng)化用例的覆蓋率,最大程度上減少手工重復(fù)的勞動(dòng)
      盡可能的提高用例的覆蓋率,并通過(guò)自動(dòng)化來(lái)代替我們的手工測(cè)試,這樣不但能在保證軟件質(zhì)量的同時(shí)減少手工重復(fù)的勞動(dòng),
      四、建立并維護(hù)好測(cè)試用例庫(kù),幫助我們節(jié)省資源并快速培養(yǎng)測(cè)試人員
      五、推廣成功案例到其它產(chǎn)品

    posted @ 2014-08-28 09:33 順其自然EVO 閱讀(533) | 評(píng)論 (0)編輯 收藏

    我對(duì)測(cè)試的理解的變遷過(guò)程

     從入行一開始就決定了不走技術(shù)路線,因?yàn)橛螒蛑允怯螒蚴且驗(yàn)槠溆螒蛐远皇羌夹g(shù)性,我愛的是游戲,而不是技術(shù)。
      1:剛?cè)胄械臅r(shí)候:找嚴(yán)重bug,或者操作步驟很多的bug,很有成就感,因?yàn)檎业絼e人找不到的bug
      2:后來(lái)意識(shí)到,基礎(chǔ)的簡(jiǎn)單的bug價(jià)值不見得比嚴(yán)重的難找的bug價(jià)值低,開始轉(zhuǎn)向追求覆蓋、不漏基礎(chǔ)簡(jiǎn)單的bug
      3:開始關(guān)注流程,流程可以減少人為失誤導(dǎo)致的bug,開始關(guān)注預(yù)防bug,特別是通過(guò)流程來(lái)預(yù)防人為bug
      4:認(rèn)為流程最重要,幾乎所有的bug都可以通過(guò)流程來(lái)預(yù)防和解決
      5:認(rèn)為測(cè)試最重要,要掌控流程和版本發(fā)布的決定權(quán)
      6:開始認(rèn)識(shí)到信息的重要性,認(rèn)為測(cè)試的職責(zé)是提供產(chǎn)品信息,而不是自己掌控決定權(quán)
      7:開始認(rèn)識(shí)到,測(cè)試要做的太多,不可能全部做到,要做取舍
      8:測(cè)試是輔助,不僅僅輔助產(chǎn)品,而且要輔助團(tuán)隊(duì);團(tuán)隊(duì)重要性高于項(xiàng)目
      9:測(cè)試不僅僅要提供產(chǎn)品的信息,也要提供人的信息,團(tuán)隊(duì)的信息

    posted @ 2014-08-28 09:31 順其自然EVO 閱讀(185) | 評(píng)論 (0)編輯 收藏

    Android、iOS和Windows Phone中的推送技術(shù)

      推送并不是什么新技術(shù),這種技術(shù)在互聯(lián)網(wǎng)時(shí)代就已經(jīng)很流行了。只是隨著進(jìn)入移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送技術(shù)顯得更加重要。因?yàn)樵谥悄?a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;">手機(jī)中,推送從某種程度上,可以取代使用多年的短信,而且與短信相比,還可以向用戶展示更多的信息(如圖像、表格、聲音等)。
      推送技術(shù)的實(shí)現(xiàn)通常會(huì)使用服務(wù)端向客戶端推送消息的方式。也就是說(shuō)客戶端通過(guò)用戶名、Key等ID注冊(cè)到服務(wù)端后,在服務(wù)端就可以將消息向所有活動(dòng)的客戶端發(fā)送。
      實(shí)際上,在很多移動(dòng)操作系統(tǒng)中,官方都為其提供了推送方案,例如,Google的云推送、IOS、Windows Phone7/8也都提供了類似的推送方案。不過(guò)這些推送方案的服務(wù)器都在國(guó)外,有一些推送服務(wù)(如Google的云推送)在國(guó)內(nèi)由于某些原因不太穩(wěn)定,所以國(guó)內(nèi)近幾年涌現(xiàn)出了很多專門為國(guó)人打造的推送服務(wù)。
      本文將從各種流行移動(dòng)操作系統(tǒng)入手介紹推送技術(shù)的各種實(shí)現(xiàn)方式。當(dāng)然,我們的主要目的是討論Android的推送技術(shù)。
      一、iOS的推送技術(shù)
      Apple為IOS提供了很完美的推送方案,其基本原理是Apple提供了自己的推送服務(wù)器,叫APNS(Apple Push Notification Service,蘋果推送通知服務(wù)器)。而客戶端設(shè)備(IPhone、IPad等)直接與APNS建立長(zhǎng)連接。不過(guò)向客戶端設(shè)備發(fā)送的消息并不是由APNS產(chǎn)生的,而是在需要發(fā)送消息的用戶自己提供的服務(wù)器(稱為Provider)中產(chǎn)生的,然后Provider將消息傳送給APNS,最后由APNS將消息傳送給客戶端設(shè)備。也就是說(shuō),消息最開始由Provider產(chǎn)生,然后Provider將消息傳送給APNS,最后再由APNS傳送給客戶端設(shè)備。消息傳遞的過(guò)程如圖1所示。
      
      在發(fā)送消息到客戶端設(shè)備接收到消息的過(guò)程中,始終伴隨這一個(gè)令牌的傳送(device token)。要想使用APNS提供消息服務(wù),應(yīng)用程序需要先向IOS注冊(cè)需要提供的一個(gè)必要的信息就是與當(dāng)前設(shè)備有關(guān)的device token,IOS在接收到devicetoken后,會(huì)向APNS查詢這個(gè)device token是否在APNS上注冊(cè)了(所有的IOS設(shè)備在第一次使用時(shí)都需要向蘋果服務(wù)器注冊(cè)一個(gè)賬號(hào),否則無(wú)法從AppleStore下載應(yīng)用,當(dāng)然更無(wú)法使用推送服務(wù)了),如果已經(jīng)注冊(cè),APNS會(huì)直接向應(yīng)用程序返回這個(gè)devicetoken。應(yīng)用程序獲得這個(gè)devicetoken后,表示APNS已經(jīng)允許向自己推送消息了,接著還需要將該device token發(fā)送給推送服務(wù)器(Provider)。到這里應(yīng)用程序已經(jīng)成功將自己注冊(cè)到APNS中了。現(xiàn)在就可以通過(guò)Provider產(chǎn)生要推送的消息,然后Provider會(huì)將消息發(fā)送給APNS服務(wù)器,最后APNS服務(wù)器會(huì)直接向應(yīng)用程序發(fā)送消息。這個(gè)過(guò)程比較復(fù)雜,不過(guò)看一下圖2的描述就會(huì)對(duì)這一過(guò)程更加了解了。每一個(gè)流程描述前面的數(shù)字表示發(fā)送的時(shí)間先后順序。
      
      二、Windows Phone的推送技術(shù)
      微軟為Window Phone提供的推送方案與IOS類似,也需要自己準(zhǔn)備推送服務(wù)器(可以稱為Cloud Service)。只是表示設(shè)備的ID變成了Uri。在Window Phone中有一個(gè)Push Client Service(PCS)。所有需要推送服務(wù)的應(yīng)用程序都需要與Push Client Service通信。下面是Window Phone推送的基本步驟,讀者可以與圖3對(duì)照來(lái)看這一過(guò)程。
      第1步:應(yīng)用程序會(huì)向Push Client Service請(qǐng)求一個(gè)Push Notification URI(①)。
      第2步:如果當(dāng)前Window Phone設(shè)備已經(jīng)在微軟服務(wù)器注冊(cè)了,Push Client Service會(huì)從MPNS(Microsoft Push Notification Service ,微軟推送通知服務(wù))獲取Push Notification URI,并返回給應(yīng)用程序,表示推送服務(wù)可用(②和③)。
      第3步:應(yīng)用程序需要將Push Notification URI發(fā)送給自己的推送服務(wù)器(Cloud Service)(④)。
      第4步:如果需要推送消息,Cloud Service會(huì)將消息發(fā)送到MPNS,然后MPNS會(huì)將消息發(fā)送給Push Client Service,最后由Push Client Service將消息傳送給應(yīng)用程序(⑤、⑥和③)。
      
    三、Android的推送方案
      Android的推送方案就比較多了,也比較亂。例如,有Google官方提供的C2DM(Android Cloud to Device Messaging);第三方的推送服務(wù)(如極光推送);還有通過(guò)各種協(xié)議實(shí)現(xiàn)的推送服務(wù)端程序(如AndroidPN),用戶通過(guò)這些服務(wù)端程序可以搭建自己的推送服務(wù)器。這些推送技術(shù)會(huì)在本節(jié)后面的部分詳細(xì)介紹,本節(jié)先來(lái)介紹一下Android中經(jīng)常使用的各種推送技術(shù)。當(dāng)然,這些推送技術(shù)也能用于其它的移動(dòng)設(shè)備,但由于Android的官方推送服務(wù)(C2DM)在國(guó)內(nèi)使用上有一些問(wèn)題,所以基于Android的第三方推送服務(wù)較其它系統(tǒng)多,因此這里主要針對(duì)Android來(lái)介紹。
      通常推送技術(shù)會(huì)使用如下兩種方式實(shí)現(xiàn)。
      1. 輪詢(Pull)方式
      2. 持久連接方式(服務(wù)端Push方式)
      輪詢方式就是客戶端以一定的時(shí)間間隔不斷查詢服務(wù)端是否有新的消息。這種方式必須自己實(shí)現(xiàn)與服務(wù)器之間的通信機(jī)制,例如消息隊(duì)列等。而且還要考慮輪詢的頻率,如果太慢可能導(dǎo)致某些消息的延遲,如果太快,則會(huì)大量消耗網(wǎng)絡(luò)帶寬和電池。所以大多數(shù)推送服務(wù)都不會(huì)使用輪詢方式。
      持久連接方式也就是Push方式,對(duì)于客戶端來(lái)說(shuō),是一種被動(dòng)的方式,而主動(dòng)權(quán)在服務(wù)端,當(dāng)有消息時(shí),服務(wù)端會(huì)向所有注冊(cè)到推送服務(wù)器的客戶端推送消息。這種推送方式的好處是可以保證實(shí)時(shí)性,而且客戶端實(shí)現(xiàn)簡(jiǎn)單。當(dāng)然,也會(huì)有不足,例如,如果大量的客戶端與服務(wù)端保持長(zhǎng)連接時(shí),會(huì)消耗服務(wù)器的資源。不過(guò)在未推送消息時(shí),這些長(zhǎng)連接就成了空閑連接,通常這種連接主要消耗的是內(nèi)存資源。例如,200萬(wàn)用戶可能會(huì)消耗數(shù)十GB的內(nèi)存。因此搭建這種推送機(jī)制時(shí)要使用性能好的服務(wù)器。
      持久連接的實(shí)現(xiàn)有很多方式,例如,可以使用XMPP作為通信協(xié)議。XMPP的主要優(yōu)勢(shì)是協(xié)議成熟、強(qiáng)大,可擴(kuò)展性強(qiáng)。XMPP更多地用于IM系統(tǒng)中,后面要介紹的AndroidPN也是用了XMPP協(xié)議。
      XMPP也有明顯的缺點(diǎn),例如,協(xié)議很復(fù)雜,如果吃透XMPP協(xié)議可能需要很長(zhǎng)時(shí)間,還有就是由于XMPP是基于XML的,從而造成了數(shù)據(jù)冗余、這樣會(huì)造成移動(dòng)設(shè)備費(fèi)流量、耗電等弊病。
      除了XMPP,還可以使用MQTT協(xié)議,這種協(xié)議的主要優(yōu)勢(shì)是簡(jiǎn)潔、小巧、可擴(kuò)展性強(qiáng),從而帶來(lái)了省流量、省電等優(yōu)點(diǎn),而且有C++版的服務(wù)端組件rsmb。缺點(diǎn)是協(xié)議不夠成熟,而且實(shí)現(xiàn)較復(fù)雜,而且rsmb不開源,部署硬件的成本較高。
      盡管C2DM服務(wù)在國(guó)內(nèi)可能不太穩(wěn)定或有一些地區(qū)不可用,但還是有必要介紹一下C2DM的原理。不過(guò)對(duì)于在國(guó)內(nèi)使用的應(yīng)用最好使用第三方的推送服務(wù),或自己假設(shè)推送服務(wù)器。
      C2DM和IOS的APNS以及Window Phone的MPNS大同小異。還需要自己準(zhǔn)備一臺(tái)推送服務(wù)器,并通過(guò)如下步驟實(shí)現(xiàn)消息的推送。
      第1步:移動(dòng)設(shè)備上的C2DM服務(wù)需要與Google官方的C2DM服務(wù)器交互,驗(yàn)證當(dāng)前設(shè)備是否在C2DM服務(wù)器上注冊(cè)了,如果已經(jīng)注冊(cè),C2DM服務(wù)器會(huì)返回一個(gè)注冊(cè)ID給客戶端的C2DM服務(wù)。(①和②)
      第2步:客戶端的C2DM服務(wù)會(huì)與自己的推送服務(wù)器交互,將賬號(hào)和C2DM服務(wù)器返回的注冊(cè)ID傳給推送服務(wù)器。(③)
      第3步:如果要推送消息,推送服務(wù)器會(huì)將注冊(cè)ID和要推送的消息先發(fā)送到C2DM服務(wù)器,然后C2DM服務(wù)器會(huì)直接將消息推送給客戶端(手機(jī)、平板電腦的設(shè)備)(④和⑤)。
      讀者可以對(duì)照?qǐng)D4來(lái)理解這3個(gè)步驟。
      除了使用官方的推送方案外,現(xiàn)在國(guó)內(nèi)涌現(xiàn)出多個(gè)第三方的推送方案,例如,極光推送(JPush)、百度推送等。讀者也可以用一下,這些同時(shí)通常是免費(fèi)的(可能推送多媒體數(shù)據(jù)需要收費(fèi))。

    posted @ 2014-08-27 10:43 順其自然EVO 閱讀(378) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共394頁(yè): First 上一頁(yè) 57 58 59 60 61 62 63 64 65 下一頁(yè) Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    • 隨筆 - 3936
    • 文章 - 404
    • 評(píng)論 - 179
    • 引用 - 0

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: A级毛片高清免费视频在线播放| 成人免费网站视频www| 国产美女a做受大片免费| 国产在线19禁免费观看| 亚洲国产精品国自产电影| 久久精品a亚洲国产v高清不卡| 亚洲一级毛片在线播放| 亚洲av日韩专区在线观看| 国产高潮流白浆喷水免费A片 | 日韩精品无码免费一区二区三区 | 亚洲一区二区成人| 成人在线免费视频| 四虎影视www四虎免费| 亚洲裸男gv网站| 亚洲精品成人片在线播放 | 亚洲视频在线免费看| 亚洲AV成人无码网天堂| 四虎最新永久免费视频| 国产极品美女高潮抽搐免费网站| 亚洲福利视频网站| 中美日韩在线网免费毛片视频 | 一区在线免费观看| 日本黄色免费观看| 五月天网站亚洲小说| 国产青草亚洲香蕉精品久久| 免费无码又爽又刺激一高潮| 亚洲AV永久无码精品一区二区国产| 亚洲国产综合精品中文第一| 久久久久无码精品亚洲日韩| 国产91色综合久久免费分享| 亚洲精品二区国产综合野狼| 国产高潮久久免费观看| 亚洲国产精品第一区二区三区| 亚洲色大网站WWW永久网站| 好吊色永久免费视频大全 | 亚洲人成777在线播放| 亚欧乱色国产精品免费视频| 四虎永久免费观看| 亚洲一本之道高清乱码| 91九色老熟女免费资源站| 久久亚洲精品国产精品|