研究了一天的Apache的连接方式,到现在为止,研究的差不多了,主要是对写后台的不太好搞定,但是,到现在为止收获颇多,现在先歇一歇我今天的收获吧!
其实主要分为两种状态,一种是直接访问服务器里面的文件,或者网站;一种是连接服务器并读取服务器里面的数据;
第一种:直接访问服务器里面的文件
直接访问服务器里面的文件用作按钮的背景色、读取服务器里面的H5文件;
这种直接访问的方法很简单的,直接网络请求就好:
按钮背景:
NSURL *url=[NSURL URLWithString: @"http://127.0.0.1/icon_route_car.png"];
NSData *data=[NSData dataWithContentsOfURL:url];
Button.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithData:data]];
读取H5
UIWebView *web =[[UIWebView alloc]initWithFrame:CGRectMake(0, 120, CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)-120)];
NSURL *weburl=[NSURL URLWithString: @"http://127.0.0.1/index.html"];
[web loadRequest:[NSURLRequest requestWithURL:weburl]];
[self.view addSubview:web];
web.delegate = self;
效果图:
第二种连接服务器读取里面的文件大概有点像小小的聊天交互
{
NSInputStream *inputStream;
NSOutputStream *outStream;
}
输入输出流使用到的代理是:NSStreamDelegate
1、连接服务器:
- (void)inputStreamAction:(UIButton *)sender{
//服务器地址
NSString *host = @"127.0.0.1";
//端口号 默认的是80 但是也可以修改的 具体如何修改在此不做说明 找度娘吧
int port = 80;
//定义C语言输入输出流
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
//把C语言的输入输出流转换成OC对象
inputStream = (__bridge NSInputStream *)(readStream);
outStream = (__bridge NSOutputStream *)(writeStream);
//设置代理
inputStream.delegate = self;
outStream.delegate = self;
//把输入输出流添加到主循环
//不添加到主运行循环 代理有可能不工作
[inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[outStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
//打开输入输出流
[inputStream open];
[outStream open];
}
监听方法:这个方法中出现错误最多的就是连接出现错误,但是一般情况下就是检查端口号是否正确,其他的基本不用管的,在此,使用的是默认端口号,如果不想使用默认端口号的,请先修改了端口号后在进行开发!
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
NSLog(@"%@",aStream.streamError);
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"输入输出流打开成功");
break;
case NSStreamEventHasBytesAvailable:
NSLog(@"有字节可读");
[self readData];
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"可以发送字节");
break;
case NSStreamEventErrorOccurred:
NSLog(@"连接出现错误");
break;
case NSStreamEventEndEncountered:
NSLog(@"连接结束");
//关闭输入输出流
[inputStream close];
[outStream close];
//移除主循环
[inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[outStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
break;
}
}
这个方法基本没用,这里只是拿出来进行说明一下
- (void)LoginInputStreamAction:(UIButton *)sender{
//登录
//发送用户名和密码
//只发送用户名,就不发送密码了
// 如果要登录,发送的数据格式为 "iam:zhangsan";
// 如果要发送聊天消息,数据格式为 "msg:did you have dinner";
//登录的指令
NSString *loginStr = @"msg:did you have dinner";
//把Str转成NSData
NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
[outStream write:data.bytes maxLength:data.length];
}
读了服务器返回的数据
-(void)readData{
//建立一个缓冲区 可以放1024个字节
uint8_t buf[1024];
// 返回实际装的字节数
NSInteger len = [inputStream read:buf maxLength:sizeof(buf)];
// 把字节数组转化成字符串
NSData *data = [NSData dataWithBytes:buf length:len];
// 从服务器接收到的数据
NSString *recStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"recStrrecStrrecStr%@",recStr);
[self reloadDataWithText:recStr];
}
该方法本是用于聊天的,布置消息界面的
-(void)reloadDataWithText:(NSString *)text{
[self.MessageArr addObject:text];
[self.TableView reloadData];
// 数据多,应该往上滚动
NSIndexPath *lastPath = [NSIndexPath indexPathForRow:self.MessageArr.count - 1 inSection:0];
[self.TableView scrollToRowAtIndexPath:lastPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
顺便再加一个无用的方法——————懒加载
//懒加载数组
- (NSMutableArray *)MessageArr{
if (!_MessageArr) {
_MessageArr = [NSMutableArray array];
}
return _MessageArr;
}