5.1 網路基礎

来源:http://www.cnblogs.com/shorfng/archive/2016/04/13/5386770.html
-Advertisement-
Play Games

1.1 網路基本概念 為什麼要學習網路編程: 在移動互聯網時代,移動應用的特征有: 移動網路應用 = + + 幾個必須掌握的基本概念: 作為 ,主要的精力都是放在前端的 開發 1.2 伺服器 按照軟體開發階段來分,伺服器可以大致分為2種 (1) 遠程伺服器 / 外網伺服器 / 正式伺服器 (2) 本 ...


本博客並非最終版本,如有更新或更正會第一時間置頂,聯繫方式詳見文末

1.1 網路基本概念

為什麼要學習網路編程:
- 網路編程是一種實時更新應用數據的常用手段

- 網路編程是開發優秀網路應用的前提和基礎

在移動互聯網時代,移動應用的特征有:
- 幾乎所有應用都需要用到網路,比如QQ、微博、網易新聞、優酷、百度地圖

- 只有通過網路跟外界進行數據交互、數據更新,應用才能保持新鮮、活力

- 如果沒有了網路,也就缺少了數據變化,無論外觀多麼華麗,終將變成一潭死水

移動網路應用 = 良好的UI +良好的用戶體驗 + 實時更新的數據
- 新聞:網易新聞、新浪新聞、搜狐新聞、騰訊新聞

- 視頻:優酷、百度視頻、搜狐視頻、愛奇藝視頻

- 音樂:QQ音樂、百度音樂、酷狗音樂、酷我音樂

- LBS:百度地圖、高德地圖、大眾點評、墨跡天氣、滴滴打車

- 電商:淘寶、京東商城、天貓、蘑菇街、凡客誠品、美麗說

- 社交:QQ、微信、微博、陌陌、比鄰

幾個必須掌握的基本概念:
客戶端(Client):移動應用(iOS、android等應用)

伺服器(Server):為客戶端提供服務、提供數據、提供資源的機器

請求(Request):客戶端向伺服器索取數據的一種行為

響應(Response):伺服器對客戶端的請求做出的反應,一般指返回數據給客戶端


作為移動開發工程師,主要的精力都是放在前端的客戶端開發

1.2 伺服器

按照軟體開發階段來分,伺服器可以大致分為2種

(1) 遠程伺服器 / 外網伺服器 / 正式伺服器

- 使用階段:應用上線後使用的伺服器

- 使用人群:供全體用戶使用

- 速度:取決於伺服器的性能、用戶的網速

(2) 本地伺服器 / 內網伺服器 / 測試伺服器

- 使用階段:應用處於開發、測試階段使用的伺服器

- 使用人群:僅供公司內部的開發人員、測試人員使用

- 速度:由於是區域網,所以速度飛快,有助於提高開發測試效率

本地伺服器的選擇:

- 在公司開發階段,已經有專門的後端人員開發伺服器程式,不由得你選擇
- 在學習階段,選擇什麼本地伺服器都可以,能用就行

如果處於學習、開發階段,自己搭建一個本地伺服器即可
比較常見的 Java伺服器 / Apache + php 伺服器

要想在Mac上方便地啟動Java伺服器,大致有以下步驟 :

(0) 安裝JDK (Java Development Kit)
(1) 安裝Java的開發工具:eclipse  下載地址:http://www.eclipse.org/downloads 選擇64bit、Java EE版本
(2) 利用Java編寫一套伺服器程式
(3) 配置伺服器的容器:Apache Tomcat  下載地址:http://tomcat.apache.org/download-60.cgi
(4) 啟動Apache Tomcat

1.2.1 配置Apache伺服器和PHP(Mac 10.10以上)

為什麼用 “Apache":
1.  使用最廣的 Web 伺服器、IIS(微軟 Intenet Infomation Server)
2.  Mac自帶,只需要修改幾個配置就可以,簡單,快捷
3.  有些特殊的伺服器功能,Apache都能很好的支持(例如:HTTP PUT/DELETE 操作,HTTPS 服務)

步驟如下:
1、在 Finder 中 /Users/用戶名 下創建一個 Sites 的文件夾,用於存放網頁等文件(不能放在桌面或文檔等個人文件夾)


2、打開【終端】
//切換工作目錄
cd /etc/apache2


3、備份文件:sudo 表示使用管理員許可權執行命令,以保護系統文件上會被破壞,使用sudo需要密碼
// cp (copy 的縮寫)   httpd.conf (源文件)   httpd.conf.bak (目標文件)
sudo cp httpd.conf httpd.conf.bak

//提示:如果後續操作出現錯誤!可以使用以下命令,恢復備份過的 httpd.conf 文件
sudo cp httpd.conf.bak httpd.conf


4、編輯 httpd.conf:修改配置文件中的"兩個路徑",指向剛剛創建的文件
//用vim編輯httpd.conf (vim裡面只能用鍵盤,不能用滑鼠)
sudo vim httpd.conf

//查找`DocumentRoot`
/DocumentRoot

//進入編輯模式
i

//修改`兩處`引號中的路徑
DocumentRoot "/Users/用戶名/Sites"
<Directory "/Users/用戶名/Sites">

//繼續向下,找到 Options FollowSymLinks Multiviews
//加一個單詞 `Indexes`,修改後的結果如下:
Options Indexes FollowSymLinks Multiviews

//返回命令模式
ESC


5、Mac系統預設已經安裝php,只是沒有激活,要使用php需要修改apache的配置文件
//查找php
/php

//將游標移動到首行
0

//刪除行首註釋 #
x

//保存並退出
:wq


6、拷貝php.ini文件
//切換工作目錄
cd /etc

//etc 目錄有點類似於 windows/system32,存放配置文件的目錄
sudo cp php.ini.default php.ini

//執行完後,ls 查看目錄,有php.ini和php.ini.default兩個文件

//重新啟動apache伺服器
//執行完後,看到下麵有AHXXX,表示成功 (如: AH00558)
sudo apachectl -k restart

如果提示以下錯誤是正常的:
httpd: Could not reliably determine the server's fully qualified domain name, using teacher.local for ServerName
httpd not running, trying to start


7、測試
打開瀏覽器,在地址欄輸入【127.0.0.1】,出現下圖表示成功


常見問題:

1、如果通過【127.0.0.1】點擊伺服器上的文件,出現下載,或者只是顯示一小段文字

解決辦法:在終端中輸入以下兩個命令

// 關閉 apache 伺服器
sudo apachectl -k stop

// 重新再次啟動 apache
sudo apachectl -k start

2、每次啟動電腦,Apache伺服器預設是不會自動啟動的,可以啟動電腦之後,打開終端,輸入以下命令

// 啟動 apache
sudo apachectl -k start

3、最常見的問題

交換文件已經存在,直接按字母 "d",可以刪除交換文件!
![](http://images2015.cnblogs.com/blog/731328/201604/731328-20160413131415473-1484732628.png)

4、執行腳本的時候,顯示沒有或拒絕訪問!(可能是用 NTFS 格式的 U 盤拷貝到電腦的腳本!這會把文件本身的許可權過濾掉!)以下是在終端中修改文件許可權的指令!

// 查看當前文件夾中的文件訪問許可權
ls -la

// info.php是沒有許可權的文件名
chmod 644 info.php

// *.*是更改所有文件的訪問許可權為644
chmod 644 *.*

文件的訪問許可權:分為三組,3個為一組,出現字母的表示1,-表示0

- r 只讀
- w 可寫
- x 執行


(1組)管理員許可權
(2組)當前用戶許可權
(3組)普通用戶許可權

3組字母常見組合:
110 000 000  ——> 600(管理員可讀可寫)
110 100 100  ——> 644(所有人可讀,管理員可讀可寫)
111 111 111  ——> 644(所有人可讀可寫可執行)不推薦

5、其他命令:

//查詢歷史輸入的命令
history

1.2.2 配置Tomcat伺服器和eclipse

未整理

1.2.3 配置WebDav (文件伺服器)

未整理

1.3 URL - 統一資源定位符

客戶端如何找到想要連接的伺服器:
客戶端通過URL找到想要連接的伺服器

URL : 統一資源定位符(Uniform Resource Locator):
通過1個URL,能找到互聯網上唯一的1個資源

URL就是資源的地址、位置,互聯網上的每個資源都有一個唯一的URL

URL的基本格式:協議://主機地址/路徑
(1)協議:不同的協議,代表著不同的資源查找方式、資源傳輸方式

(2)主機地址:存放資源的主機(伺服器)的IP地址(功能變數名稱)

本地伺服器的主機地址一般有3種寫法:
①127.0.0.1 :每台機器內置的IP地址,指的就是機器本身
②localhost :等價於第1種情況的127.0.0.1
③交換機、路由器分配的IP地址 :真機測試一定要用這個,且真機和伺服器得在同一個區域網

(3)路徑:資源在主機(伺服器)中的具體位置

URL中常見的協議:

(1) HTTP :超文本傳輸協議(網路開發中最常用的協議)

- 訪問的是遠程的網路資源,用於傳輸 HTML、圖像、視頻二進位數據等

- 格式是 http://

(2) file

- 訪問的是本地電腦上的資源

- 格式是 file://(不用加主機地址)

(3) mailto

- 訪問的是電子郵件地址

- 格式是 mailto:

(4) FTP

- 訪問的是共用主機的文件資源

- 格式是 ftp://

1.4 網路狀態監控

1.4.1 網路狀態監控-Reachability

在網路應用中,需要對用戶設備的網路狀態進行實時監控,目的是讓用戶瞭解自己的網路狀態,防止一些誤會(比如怪應用無能)

根據用戶的網路狀態進行智能處理,節省用戶流量,提高用戶體驗

- WIFI、3G網路:自動下載高清圖片
- 低速網路:只下載縮略圖
- 沒有網路:只顯示離線的緩存數據

Reachability的使用步驟:

(1)添加框架SystemConfiguration.framework


(2)添加源代碼

蘋果官方提供了一個叫Reachability的示常式序,便於開發者檢測網路狀態

https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip


(3)包含頭文件

#import "Reachability.h"

Reachability常見方法

1.主動監測監測網路狀態

// 是否WIFI
+ (BOOL)isEnableWIFI {
    return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}

// 是否3G
+ (BOOL)isEnable3G {
    return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}

2.監控網路狀態

1> 監聽通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

2> 開始監聽網路狀態
// 獲得Reachability對象
self.reachability = [Reachability reachabilityForInternetConnection];
// 開始監控網路
[self.reachability startNotifier];

3> 移除監聽
[self.reachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];

代碼示例:
#import "Reachability.h"
#import "ViewController.h"

@interface ViewController ()
@property(nonatomic, strong) Reachability *reachability; //監控網路
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  [self getNetworkStatus];

  // 監聽網路狀態發生改變的通知
  [[NSNotificationCenter defaultCenter]
      addObserver:self
         selector:@selector(getNetworkStatus)
             name:kReachabilityChangedNotification
           object:nil];

  // 獲得Reachability對象
  self.reachability = [Reachability reachabilityForInternetConnection];
  // 開始監控網路(一旦網路狀態發生改變,就會發出通知kReachabilityChangedNotification)
  [self.reachability startNotifier];
}

// 獲取現在的網路狀態
- (void)getNetworkStatus {
  if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus !=
      NotReachable) {
    NSLog(@"是wifi");
  } else if ([Reachability reachabilityForInternetConnection]
                 .currentReachabilityStatus != NotReachable) {
    NSLog(@"是手機自帶網路");
  } else {
    NSLog(@"網路有問題");
  }
}

// 移除通知
- (void)dealloc {

  [[NSNotificationCenter defaultCenter] removeObserver:self];

  [self.reachability stopNotifier];
  self.reachability = nil;
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end

1.4.2 網路狀態監控-AFN框架

typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
  AFNetworkReachabilityStatusUnknown = -1,         // 未知網路
  AFNetworkReachabilityStatusNotReachable = 0,     // 無法聯網
  AFNetworkReachabilityStatusReachableViaWWAN = 1, // 手機自帶網路
  AFNetworkReachabilityStatusReachableViaWiFi = 2, // WIFI
};

代碼示例:

#import "ViewController.h"
#import <AFNetworking.h>

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // 開始網路監控(獲得網路監控的管理者)
  AFNetworkReachabilityManager *mgr =
      [AFNetworkReachabilityManager sharedManager];

  // 設置網路狀態改變後的處理
  [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    // 當網路狀態改變了, 就會調用這個block
    switch (status) {
    case AFNetworkReachabilityStatusUnknown: // 未知網路
      NSLog(@"未知網路");
      break;

    case AFNetworkReachabilityStatusNotReachable: // 沒有網路(斷網)
      NSLog(@"沒有網路(斷網)");
      break;

    case AFNetworkReachabilityStatusReachableViaWWAN: // 手機自帶網路
      NSLog(@"手機自帶網路");
      break;

    case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI
      NSLog(@"WIFI");
      break;
    }
  }];

  // 開始監控
  [mgr startMonitoring];

  // 拿到當前網路狀態
  // mgr.networkReachabilityStatus;
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end

如果你覺得本篇文章對你有所幫助,請點擊文章末尾右下角“推薦”,^_^

作者:藍田(Loto)

出處:http://www.cnblogs.com/shorfng/

如有疑問,請在下方評論區回覆 OR 發送郵件至 [email protected]聯繫我。



本文版權歸作者和博客園共有,歡迎轉載,但未經作者���意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • title: 寫技術文章必備的幾個小工具 tags: 小書匠,有道雲筆記,gif錄屏工具 今天給大家推薦寫博客必備的幾個工具,也是我自己每次寫文章用到的。 一.小書匠 這個工具是 345大神 告訴我的,非常好用的MakeDown編輯器,比較常見的網站都支持,例如:csdn,簡書。 "官網下載頁面傳送 ...
  • 前言:第一篇文章,EventBus很多項目都在用,本文參照http://blog.csdn.net/harvic880925/article/details/40660137,自己做了一遍。把有用的挑揀出來,記錄一下啊 一、概述 EventBus是一款針對Android優化的發佈/訂閱事件匯流排。主要 ...
  • 把數據請求和風火輪的效果封裝成一個方法,用的時候直接調用這個方法就可以 + (void)startRequest:(NSString*)method baseurl:(NSString*)baseurl param:(NSDictionary*)params success:(DKSuccess)s ...
  • NSURLConnection,在iOS9被宣佈棄用,本文不使用NSURLConnection進行網路編程,有興趣的童鞋可以參考:iOS開發中的同步、非同步,GET、POST請求方法(NSURLConnection篇) NSURLSession,是在2013年的WWDC上,由Apple提出的NSURL ...
  • Swift支持大部分標準C語言的運算符, 且改進許多特性來減少常規編碼錯誤.如賦值符 = 不返回值, 以防止錯把等號 == 寫成賦值號 = 而導致Bug. 數值運算符( + , -, *, /, %等)會檢測並不允許值溢出, 以此來避免保存變數時由於變數大於或小於其類型所能承載的範圍時導致的異常結果 ...
  • 本文涉及到的WWDC2013 Session有 1.Session 206 Getting Started with UIKit Dynamics 2.Session 221 Advanced Techniques with UIKit Dynamics 什麼是UIKit動力學(UIKit Dyna ...
  • Android 環境搭建 (1)所需材料 eclipse 、ADT 、SDK 下載地址: ADT-15.0.0 android-sdk-windows eclipse-jee-helios-win32 jdk-8u65-windows-x64 http://pan.baidu.com/s/1o7Pu ...
  • 要使用它的話, 首先, 你要引用你的庫 到你的當前工程裡面, 操作方式如下,右鍵你當前的工程, build path 下的 Congfig Build Path,進入android,點擊add 然後,就有你的庫的工程,雙擊就ok。如圖 上面的步驟ok的話,現在就開始使用你的框架了 。 具體 應用的代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...