本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末
如果觉得本文内容过长,请前往本人"简书"
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联系我。
本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。