色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙的網絡管理功能你們知道有多厲害嗎

OpenHarmony技術社區 ? 來源:鴻蒙技術社區 ? 作者:Buty9147 ? 2021-10-11 14:26 ? 次閱讀

本示例演示了如何使用網絡管理模塊相關接口,演示了以下功能:

  • 功能 1:使用默認網絡,打開連接,發送 HTTP 請求。

  • 功能 2:統計指定 UID 的上行/下行流量。

  • 功能 3:使用 Socket 方式實現不同設備間通信。此功能需要打開 WIFI,并且通信的設備連接相同的 WIFI 組成局域網。操作上,先啟動服務端,再啟動客戶端,然后從客戶端發送消息,查看服務端是否收到消息。

  • 功能 4:HTTP 緩存的使用,創建緩存,供下一次請求使用,減少數據流量和加載時間。

注意,需要以下權限:

  • ohos.permission.GET_NETWORK_INFO:獲取網絡連接信息。

  • ohos.permission.SET_NETWORK_INFO:修改網絡連接狀態。

  • ohos.permission.INTERNET:允許程序打開網絡套接字,進行網絡連接。

詳情見官方文檔,網絡管理開發概述:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/connectivity-net-overview-0000000000029978

搭建環境

安裝 DevEco Studio,詳情請參考DevEco Studio 下載
https://developer.harmonyos.com/cn/develop/deveco-studio

設置 DevEco Studio 開發環境,DevEco Studio 開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用。

可以根據如下兩種情況來配置開發環境:

  • 如果可以直接訪問 Internet,只需進行下載 HarmonyOS SDK 操作。

  • 如果網絡不能直接訪問 Internet,需要通過代理服務器才可以訪問,請參考配置開發環境。
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/environment_config-0000001052902427

下載源碼后,使用 DevEco Studio 打開項目,模擬器運行即可。真機運行需要將 config.json 中的 buddleName 修改為自己的,如果沒有請到 AGC 上進行配置。

參見《使用模擬器進行調試

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404

代碼結構

①代碼結構

如下圖:

3576ed16-2a47-11ec-82a8-dac502259ad0.png

②相關文件介紹

核心類:

  • HttpURLConnection.java //支持 HTTP 特定功能的 URLConnection

  • URLConnection.java //URL 連接

  • URL.java //指向萬維網上“資源”的指針

  • NetStatusCallback.java //網絡狀態的回調類,出現可用網絡觸發onAvailable函數

  • DataFlowStatistics.java //該類提供查詢指定蜂窩網絡、應用和網卡的整體流量統計和流量統計的接口

  • DatagramSocket.java //此類表示用于發送和接收數據報包的套接字。

  • DatagramPacket.java //數據報包

  • WifiDevice.java //該類提供 Wi-Fi 管理接口

  • NetManager.java //提供接口來管理和使用數據網絡

  • NetHandle.java //數據網絡

  • InetAddress.java //網絡 IP 地址

  • HttpResponseCache.java //該類緩存 HTTP 和 HTTPS 響應以供重用

自定義的類:

  • ThreadPoolUtil.java //線程池工具類

  • MainAbilitySlice.java //主頁面

  • NetRequestSlice.java //網絡請求&流量統計 功能頁

  • SocketClientSlice.java //Socket 客戶端

  • SocketServerSlice.java //Socket 服務端

  • HttpCacheSlice.java //HTTP 緩存功能頁

頁面布局:

  • http_cache_slice.xml //HTTP 緩存示例頁

  • net_request.slice.xml //HTTP 請求頁面

  • socket_client_slice.xml //Socket 通信客戶端頁

  • socket_server_slice.xml //Socket 通信服務端頁

  • main_ability_slice.xml //主頁面

實例講解

①界面布局

如下圖:

35f45a26-2a47-11ec-82a8-dac502259ad0.png

369ebc1e-2a47-11ec-82a8-dac502259ad0.png

371711dc-2a47-11ec-82a8-dac502259ad0.png

②后臺代碼

NetRequestSlice.java 網絡請求&流量統計功能

a.初始化網絡管理對象 NetManager。
//初始化網絡管理對象
netManager=NetManager.getInstance(null);

b.通過線程池獲取一個新線程處理進行連接請求,獲取默認數據網絡的時候需要 ohos.permission.GET_NETWORK_INFO 權限。

//用線程池的取一個新線程處理
ThreadPoolUtil.submit(()->{
HiLog.debug(LABEL_LOG,"%{public}s","ThreadPoolUtilsubmit");
//獲取默認的數據網絡,wifi和流量都關閉時,netId==0,其它時netId=390/391,musthavetheohos.permission.GET_NETWORK_INFOpermission
NetHandlenetHandle=netManager.getDefaultNet();
//接收默認數據網絡的狀態更改的回調
netManager.addDefaultNetStatusCallback(callback);

//netManager.setAppNet(netHandle);

//支持 HTTP 特定功能的 URLConnection。
HttpURLConnectionconnection=null;
//輸出流
try(ByteArrayOutputStreamoutputStream=newByteArrayOutputStream()){
//請求的URL
StringurlString=inputText.getText();

URLurl=newURL(urlString);
//使用netHandle打開URL連接,不使用代理
URLConnectionurlConnection=netHandle.openConnection(url,java.net.Proxy.NO_PROXY);
HiLog.debug(LABEL_LOG,"%{public}s","netHandleopenConnection");
//強轉換類型
if(urlConnectioninstanceofHttpURLConnection){
connection=(HttpURLConnection)urlConnection;
}
//請求類型
connection.setRequestMethod("GET");
//連接
connection.connect();
//流量統計
trafficDataStatistics(false);

try(InputStreaminputStream=urlConnection.getInputStream()){
byte[]cache=newbyte[2*1024];
intlen=inputStream.read(cache);
while(len!=-1){
//
outputStream.write(cache,0,len);
len=inputStream.read(cache);
}
}catch(IOExceptione){
HiLog.error(LABEL_LOG,"%{public}s","netRequestinnerIOException");
}
//返回結果
Stringresult=newString(outputStream.toByteArray());

//UI顯示
getUITaskDispatcher().asyncDispatch(()->outText.setText(result));
//統計完畢
trafficDataStatistics(true);

}catch(IOExceptione){
HiLog.error(LABEL_LOG,"%{public}s","netRequestIOException");
}
});

c.按照應用 ID,進行數據流量統計,在發送請求前獲取一次,在請求完成后獲取一次。

gitee 代碼中這個地方有一處筆誤,tx 代表上行流量,rx 代表下行流量才對。

詳情見官方文檔說明《流量統計》:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/connectivity-net-traffic-0000000000045998

/**
*按照應用ID,進行數據流量統計
*
*@paramisStart
*/
privatevoidtrafficDataStatistics(booleanisStart){
intuid=0;
try{
//根據給定的包名稱和用戶 ID 獲取應用程序 UID。
uid=getBundleManager().getUidByBundleName(getBundleName(),0);
}catch(RemoteExceptione){
HiLog.error(LABEL_LOG,"%{public}s","trafficDataStatisticsRemoteException");
}
if(isStart){
//獲取指定UID的下行流量。
rx=DataFlowStatistics.getUidRxBytes(uid);
//獲取指定UID的上行流量。
tx=DataFlowStatistics.getUidTxBytes(uid);
}else{
rx=DataFlowStatistics.getUidRxBytes(uid)-rx;
tx=DataFlowStatistics.getUidTxBytes(uid)-tx;

//設置UI顯示
getUITaskDispatcher().asyncDispatch(()->statisticsText.setText(
"TrafficDataStatistics:"+System.lineSeparator()
+"Receivetraffic:"+rx+System.lineSeparator()
+"Senttraffic:"+tx));
}
}
}

SocketClientSlice.java/SocketServerSlice.java Socket 客戶端/服務端

實現 Socket 通信,是要客戶端和服務端的,服務端在指定網卡上監聽指定端口,客戶端向指定 IP 指定端口發送數據,實現通信。

a.Socket 服務端開啟監聽,等待接收數據。

//監聽端口
privatestaticfinalintPORT=8888;

/**
*啟動socket服務監聽
*
*@paramcomponent
*/
privatevoidstartServer(Componentcomponent){
HiLog.debug(LABEL_LOG,"startServer");

//線程池獲取新線程處理
ThreadPoolUtil.submit(()->{
//在指定端口開啟監聽
try(DatagramSocketsocket=newDatagramSocket(PORT)){
//數據報包
DatagramPacketpacket=newDatagramPacket(newbyte[255],255);
//死循環接收數據
while(true){
//接收數據
socket.receive(packet);

//通過專有線程同步設置要顯示接收到的數據
getUITaskDispatcher().syncDispatch(()->outText.setText(
"Receiveamessagefrom:"+packet.getAddress().getHostAddress()
+System.lineSeparator()+"onport"+packet.getPort()
+System.lineSeparator()+"message:"+newString(
packet.getData()).substring(0,packet.getLength())
));
packet.setLength(255);

//延遲一下,留出處理數據的時間
Thread.sleep(1000);
}
}catch(IOException|InterruptedExceptione){
e.printStackTrace();
HiLog.error(LABEL_LOG,"%{public}s","StartServerIOException|InterruptedException"+e);
}
});
}


/**
*獲取服務器端IP地址,顯示給客戶端發送消息使用
*
*@return
*/
privateStringgetLocationIpAddress(){
HiLog.debug(LABEL_LOG,"getLocationIpAddress");
//提供接口來管理 Wi-Fi。
WifiDevicewifiDevice=WifiDevice.getInstance(this);
HiLog.debug(LABEL_LOG,"wifiDevice:"+wifiDevice);
//WifiLinkedInfo提供有關 Wi-Fi 連接的信息。
OptionallinkedInfo=wifiDevice.getLinkedInfo();
HiLog.debug(LABEL_LOG,"linkedInfo:"+linkedInfo);
//獲取IP地址
intip=linkedInfo.get().getIpAddress();
HiLog.debug(LABEL_LOG,"ip:"+ip);
return(ip&0xFF)+"."+((ip>>8)&0xFF)+"."+((ip>>16)&0xFF)+"."+(ip>>24&0xFF);
}

b.Socket 客戶端發送數據,等待接收數據。

初始化 NetManager 對象→new 一個 DatagramSocket獲取當前數據網絡 NetHandle獲取服務端的 IP 地址對象 InetAddressDatagramSocket 綁定到 NetHandlenew 一個數據報包 DatagramPacket發送數據。

//通信端口
privatestaticfinalintPORT=8888;


/**
*發送網絡請求
*@paramcomponent
*/
privatevoidnetRequest(Componentcomponent){
HiLog.debug(LABEL_LOG,"netRequest");
//啟動新線程
ThreadPoolUtil.submit(()->{
//初始化網絡管理對象
NetManagernetManager=NetManager.getInstance(null);

//檢查默認數據網絡是否已激活。
if(!netManager.hasDefaultNet()){
return;
}
//new套接字
try(DatagramSocketsocket=newDatagramSocket()){
//獲取當前數據網絡
NetHandlenetHandle=netManager.getDefaultNet();

//獲取服務端的IP地址
InetAddressaddress=netHandle.getByName(inputText.getText());
//將套接字綁定到當前網絡
netHandle.bindSocket(socket);
byte[]buffer="I'mfromClient".getBytes();
//數據包
DatagramPacketrequest=newDatagramPacket(buffer,buffer.length,address,PORT);
//發送數據
socket.send(request);
HiLog.debug(LABEL_LOG,"sendsocket");
}catch(IOExceptione){
e.printStackTrace();
HiLog.error(LABEL_LOG,"%{public}s","netRequestIOException"+e);
}
});
}

HttpCacheSlice.java HTTP 緩存功能

應用重復打開一個相同網頁時,可以優先從緩存文件里讀取內容,從而減少數據流量,降低設備功耗,提升應用性能。

問:如何設置優先從緩存文件里讀取內容?答:不用額外設置,自動的~~設置緩存,需要考慮緩存位置和緩存大小。

a.初始化緩存 install。

/**
*開啟緩存
*開啟后自動緩存數據,不需要手動處理
*/
privatevoidinitCache(Componentcomponent){
//默認的緩存目錄
FilehttpCacheDir=newFile(this.getCacheDir(),"http");
//緩存大小
longhttpCacheSize=10*1024*1024;
try{
//配置緩存目錄及最大緩存空間
HttpResponseCache.install(httpCacheDir,httpCacheSize);
HiLog.debug(LABEL_LOG,"%{public}s","initCache,cacheinstalled["+httpCacheDir+"]");
}catch(IOExceptione){
HiLog.error(LABEL_LOG,"%{public}s","initCacheIOException");
}
}

b.保存緩存,將緩存寫入文件系統 flush。

/**
*將緩存寫入文件系統,防止緩存丟失
*/
privatevoidflushCache(Componentcomponent){
HiLog.debug(LABEL_LOG,"%{public}s","flushCache");
try{
//獲取緩存對象
HttpResponseCachecache=HttpResponseCache.getInstalled();
HiLog.debug(LABEL_LOG,"%{public}s","cache:"+cache);
if(cache!=null){
try{
//將緩存寫入文件系統,如果cacheisclosed會報錯//java.lang.IllegalStateException:cacheisclosed
cache.flush();
getUITaskDispatcher().syncDispatch(()->{
//圖片加載時間,測試緩存和不緩存的差別
duration.setText("cacheflushsuccess");
});
HiLog.debug(LABEL_LOG,"%{public}s","cacheflush");
}catch(IOExceptione){
HiLog.error(LABEL_LOG,"%{public}s","onStopIOException");
}
}
}catch(IllegalStateExceptione){
e.printStackTrace();
}
}

c.禁用緩存并刪除其中的數據 delete。
/**
*禁用緩存并刪除其中的數據
*/
privatevoiddeleteCache(Componentcomponent){
HiLog.debug(LABEL_LOG,"%{public}s","deleteCache");
//獲取緩存對象
HttpResponseCachecache=HttpResponseCache.getInstalled();
HiLog.debug(LABEL_LOG,"%{public}s","cache:"+cache);
if(cache!=null){
try{
//禁用緩存并刪除其中的數據。
cache.delete();
image.setPixelMap(null);
HiLog.debug(LABEL_LOG,"%{public}s","cachedelete");
}catch(IOExceptione){
HiLog.error(LABEL_LOG,"%{public}s","onStopIOException");
}

}
}

/**
*測試請求
*
*@paramcomponent
*/
privatevoidstartRequest(Componentcomponent){
HiLog.debug(LABEL_LOG,"%{public}s","startRequest");
ThreadPoolUtil.submit(()->{
try{
longstartTime=System.currentTimeMillis();
HiLog.debug(LABEL_LOG,"%{public}s","startTime:"+startTime);
//請求URL
URLurl=newURL(inputText.getText());
URLConnectionurlConnection=url.openConnection();
HiLog.debug(LABEL_LOG,"%{public}s","openConnection");
//判斷連接類型
if(urlConnectioninstanceofHttpURLConnection){
HiLog.debug(LABEL_LOG,"%{public}s","urlConnection");
HttpURLConnectionconnection=(HttpURLConnection)urlConnection;
HiLog.debug(LABEL_LOG,"%{public}s","connect:"+connection);
//連接
connection.connect();
HiLog.debug(LABEL_LOG,"%{public}s","connected");
//連接結果
if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
HiLog.debug(LABEL_LOG,"%{public}s","HTTP_OK");
//描述圖像數據源選項,例如包括表示為 image/png 的圖像格式。
ImageSource.SourceOptionssrcOpts=newImageSource.SourceOptions();
ImageSourceimageSource=ImageSource.create(connection.getInputStream(),srcOpts);
//以像素矩陣的形式提供圖像。
PixelMappixelMap=imageSource.createPixelmap(null);
HiLog.debug(LABEL_LOG,"%{public}s","pixelMap:"+pixelMap);
//專有線程同步設置圖片顯示
getUITaskDispatcher().syncDispatch(()->{
image.setPixelMap(pixelMap);
//圖片加載時間,測試緩存和不緩存的差別
duration.setText(String.valueOf(System.currentTimeMillis()-startTime)+"ms");
});
HiLog.debug(LABEL_LOG,"%{public}s","setPixelMap");
HiLog.debug(LABEL_LOG,"%{public}s","endTime:"+(System.currentTimeMillis()-startTime));
}
HiLog.debug(LABEL_LOG,"%{public}s","finish");
//關閉連接
connection.disconnect();
}
}catch(Exceptione){
HiLog.error(LABEL_LOG,"%{public}s","initCacheException"+e);
getUITaskDispatcher().syncDispatch(()->{
//圖片加載時間,測試緩存和不緩存的差別
duration.setText("cacheisclosed,pleaseopencache");
});
}
});
}

總結說明

①兩種打開網絡連接的方式:

URLConnectionurlConnection=url.openConnection();

//使用netHandle打開URL連接,不使用代理
URLConnectionurlConnection=netHandle.openConnection(url,java.net.Proxy.NO_PROXY);

②未開啟緩存情況下,發送請求的時長在 400-2000ms 之間,開啟后,需要點擊兩次發送請求,時長維持在 90-200ms 左右。

③禁用并清除緩存 delete/close 后,在沒有再次開啟緩存前,無法發送請求。這個操作官方文檔注釋寫的是 “結束時關閉緩存”。

完整代碼

附件直接下載:

https://harmonyos.51cto.com/resource/1270
編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 網絡管理
    +關注

    關注

    0

    文章

    120

    瀏覽量

    27670
  • HTTP
    +關注

    關注

    0

    文章

    504

    瀏覽量

    31198
  • 數據包
    +關注

    關注

    0

    文章

    260

    瀏覽量

    24385
  • 代碼
    +關注

    關注

    30

    文章

    4780

    瀏覽量

    68539
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2634

    瀏覽量

    66308

原文標題:鴻蒙的網絡管理功能,十分強悍!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ShiMeta鴻蒙屏同步拼接解決方案

    ???方案概述鴻蒙屏同步解決方案在ShiMeta鴻蒙數字標牌系統的基礎上,通過信號處理器,實現多個顯示屏幕之間的內容同步顯示,以提升信息傳達的效率和視覺體驗。鴻蒙
    的頭像 發表于 12-13 16:45 ?103次閱讀
    ShiMeta<b class='flag-5'>鴻蒙</b><b class='flag-5'>多</b>屏同步拼接解決方案

    TPA3118發熱厲害,然后電感也發熱比較厲害,是什么原因?

    TPA3118發熱厲害,然后電感也發熱比較厲害,不知道是什么原因,當時聲音又很正常,沒有什么底噪呀啥的
    發表于 10-12 07:00

    36歲了還有必要轉行鴻蒙開發嗎?

    開發員的職業前景光明,提供了大量的創新機會,助力實現個人職業目標。 最后 如果大家覺得這篇內容對學習鴻蒙開發有幫助,我想邀請大家幫我三個小忙: 點贊,轉發,你們的 『點贊和評論』,才是我創造的動力
    發表于 05-09 17:01

    鴻蒙的1萬個理由,北京中關村現大幅鴻蒙海報

    ,學習鴻蒙已成為高校和企業的熱門趨勢。隨鴻蒙生態的飛速發展,正如張朝陽所說,現在是學習鴻蒙的黃金時期。 最后 如果大家覺得這篇內容對學習鴻蒙開發有幫助,我想邀請大家幫我三個小忙: 點
    發表于 05-08 20:31

    實錘!騰訊終于擁抱鴻蒙生態,微信鴻蒙原生版本即將上線

    第一個,也是唯一的一個手機操作系統多么的喜歡。 最后 如果大家覺得這篇內容對學習鴻蒙開發有幫助,我想邀請大家幫我三個小忙: 點贊,轉發,你們的 『點贊和評論』,才是我創造的動力。
    發表于 04-30 21:14

    鴻蒙OS開發實例:【HarmonyHttpClient】網絡框架

    鴻蒙上使用的Http網絡框架,里面包含純Java實現的HttpNet,類似okhttp使用,支持同步和異步兩種請求方式;還有鴻蒙版retrofit,和Android版Retrofit相似的使用,解放雙手般優雅使用注解、自動解析j
    的頭像 發表于 04-12 16:58 ?827次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發實例:【HarmonyHttpClient】<b class='flag-5'>網絡</b>框架

    鴻蒙原生應用開發-網絡管理模塊總述

    一、網絡管理模塊主要提供以下功能: HTTP數據請求:通過HTTP發起一個數據請求。 WebSocket連接:使用WebSocket建立服務器與客戶端的雙向連接。 Socket連接:通過Socket
    發表于 04-08 09:45

    鴻蒙實戰項目開發:【短信服務】

    環境搭建 ? 《鴻蒙開發基礎》 ArkTS語言 安裝DevEco Studio 運用你的第一個ArkTS應用 ArkUI聲明式UI開發 .…… ? 《鴻蒙開發進階》 Stage模型入門 網絡
    發表于 03-03 21:29

    鴻蒙這么大聲勢,為何遲遲看不見崗位?最新數據來了

    基礎》 ArkTS語言 安裝DevEco Studio 運用你的第一個ArkTS應用 ArkUI聲明式UI開發 .…… 《鴻蒙開發進階》 Stage模型入門 網絡管理 數據管理 電話
    發表于 02-29 20:53

    知道激光鉆孔技術牛嗎?看完這篇文章你就明白了

    知道激光鉆孔技術牛嗎?看完這篇文章你就明白了
    的頭像 發表于 02-29 17:09 ?957次閱讀

    學習鴻蒙背后的價值?星河版開放如何學習?

    鴻蒙原生內核。 實現了AI框架、大模型、設計系統、編程框架、編程語言、編譯器等全棧自研,核心技術、全棧能力、底座和生態,是真正的操作系統,而非安卓套皮。關鍵是鴻蒙星河版本也就意味
    發表于 02-22 20:55

    純血鴻蒙系統,拿什么與安卓、iOS比?

    ArkUI …… 2、鴻蒙進階 Stage模型 網絡、數據管理 一次開發段部署 …… 3、鴻蒙多媒體技術 音頻 視頻 相機 圖片 …… 4
    發表于 02-21 21:04

    鴻蒙OS和開源鴻蒙什么關系?

    內核,其他功能都以模塊的形式存在。 ? ? 華為用的是鴻蒙OS 我們都知道,華為手機的鴻蒙OS是可以運行安卓軟件的,是因為系統中有安卓兼容層,所以可以簡單這么理解:
    的頭像 發表于 01-30 15:44 ?1131次閱讀
    <b class='flag-5'>鴻蒙</b>OS和開源<b class='flag-5'>鴻蒙</b>什么關系?

    余承東發布HarmonyOS NEXT,鴻蒙生態發展速度到底驚人?

    “純血”鴻蒙到來2024年1月18日,華為發布了備受期待的鴻蒙星河版,正式宣告了鴻蒙作為第三大操作系統的登場。這一消息不僅讓人矚目,更讓人對鴻蒙生態系統的發展速度感到驚嘆。
    的頭像 發表于 01-26 08:34 ?820次閱讀
    余承東發布HarmonyOS NEXT,<b class='flag-5'>鴻蒙</b>生態發展速度到底<b class='flag-5'>有</b><b class='flag-5'>多</b>驚人?

    1月18號“純鴻蒙”千帆啟航,程序員預備!

    …… 《鴻蒙開發進階》http://qr61.cn/oWQPaX/qU3VHZO 1.Stage模型入門 2.網絡管理 3.數據管理 4.電話服務 5.分布式應用開發 6.通知與窗口
    發表于 01-16 22:13
    主站蜘蛛池模板: 亚洲午夜精品一区二区公牛电影院| 欧美国产影院| 99re这里只有精品视频| 欧美高清videossexo| 超碰97人人做人人爱少妇| 色偷偷91综合久久噜噜| 国产乱人视频在线观看| 亚洲色大成网站WWW永久麻豆| 久久视频这里只精品99热在线观看| 97精品在线观看| 日韩爽爽影院在线播放| 国产区在线不卡视频观看| 伊人草久久| 女人 我狠狠疼你| 古风一女N男到处做高H| 亚洲国产成人在线| 久久永久视频| 操他射他影院| 亚洲成色爱我久久| 老师的脚奴| 成人影片下载网站| 久久久久综合网久久| a免费视频| 小SAO货水真多把你CAO烂| 久久精品国产欧美| jizzjizz3d动漫| 午夜在线视频国产极品片| 久久亚洲精品成人| 成人免费视频在线观看| 亚洲激情网站| 男同志vdieos免费| 国产精品久久久久激情影院| 欲香欲色天天影视大全| 秋霞特色大片18岁入口| 国自精品三七区| 99热这里只有精品88| 小短文H啪纯肉公交车| 伦理片天堂eeuss影院2o12| 丰满大屁俄罗斯肥女| 一区二区三区福利视频| 青青视频国产依人在线|