5.1 网络基础

本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末

如果觉得本文内容过长,请前往本人"简书"


# 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 发送邮件shorfng@126.com联系我。



本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

posted @ 2016-04-13 13:19  蓝田_Loto  阅读(292)  评论(0编辑  收藏  举报