為什么80%的碼農都做不了架構師?>>> ??
#import?"ViewController.h"@interface?ViewController?()<NSStreamDelegate,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>{NSInputStream?*_inputStream;//對應輸入流NSOutputStream?*_outputStream;//對應輸出流
}
@property?(weak,?nonatomic)?IBOutlet?NSLayoutConstraint?*inputViewConstraint;
@property?(weak,?nonatomic)?IBOutlet?UITableView?*tableView;
@property?(nonatomic,?strong)?NSMutableArray?*chatMsgs;//聊天消息數組
@end
@implementation?ViewController
-(NSMutableArray?*)chatMsgs{if?(!_chatMsgs)?{_chatMsgs?=?[NSMutableArray?array];}return?_chatMsgs;
}
-?(void)viewDidLoad?{[super?viewDidLoad];//?2.收發數據//?做一個聊天//?1.用戶登錄//?2.收發數據//?監聽鍵盤[[NSNotificationCenter?defaultCenter]?addObserver:self?selector:@selector(kbFrmWillChange:)?name:UIKeyboardWillChangeFrameNotification?object:nil];
}
-(void)kbFrmWillChange:(NSNotification?*)noti{//?獲取窗口的高度CGFloat?windowH?=?[UIScreen?mainScreen].bounds.size.height;//?鍵盤結束的FrmCGRect?kbEndFrm?=?[noti.userInfo[UIKeyboardFrameEndUserInfoKey]?CGRectValue];//?獲取鍵盤結束的y值CGFloat?kbEndY?=?kbEndFrm.origin.y;self.inputViewConstraint.constant?=?windowH?-?kbEndY;
}-(void)stream:(NSStream?*)aStream?handleEvent:(NSStreamEvent)eventCode{NSLog(@"%@",[NSThread?currentThread]);
//????NSStreamEventOpenCompleted?=?1UL?<<?0,//輸入輸出流打開完成
//????NSStreamEventHasBytesAvailable?=?1UL?<<?1,//有字節可讀
//????NSStreamEventHasSpaceAvailable?=?1UL?<<?2,//可以發放字節
//????NSStreamEventErrorOccurred?=?1UL?<<?3,//?連接出現錯誤
//????NSStreamEventEndEncountered?=?1UL?<<?4//?連接結束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];[_outputStream?close];//?從主運行循環移除[_inputStream?removeFromRunLoop:[NSRunLoop?mainRunLoop]?forMode:NSDefaultRunLoopMode];[_outputStream?removeFromRunLoop:[NSRunLoop?mainRunLoop]?forMode:NSDefaultRunLoopMode];break;default:break;}
}
-?(IBAction)connectToHost:(id)sender?{//?1.建立連接NSString?*host?=?@"127.0.0.1";int?port?=?12345;//?定義C語言輸入輸出流CFReadStreamRef?readStream;CFWriteStreamRef?writeStream;CFStreamCreatePairWithSocketToHost(NULL,?(__bridge?CFStringRef)host,?port,?&readStream,?&writeStream);//?把C語言的輸入輸出流轉化成OC對象_inputStream?=?(__bridge?NSInputStream?*)(readStream);_outputStream?=?(__bridge?NSOutputStream?*)(writeStream);//?設置代理_inputStream.delegate?=?self;_outputStream.delegate?=?self;//?把輸入輸入流添加到主運行循環//?不添加主運行循環?代理有可能不工作[_inputStream?scheduleInRunLoop:[NSRunLoop?mainRunLoop]?forMode:NSDefaultRunLoopMode];[_outputStream?scheduleInRunLoop:[NSRunLoop?mainRunLoop]?forMode:NSDefaultRunLoopMode];//?打開輸入輸出流[_inputStream?open];[_outputStream?open];
}
-?(IBAction)loginBtnClick:(id)sender?{//?登錄//?發送用戶名和密碼//?在這里做的時候,只發用戶名,密碼就不用發送//?如果要登錄,發送的數據格式為?"iam:zhangsan";//?如果要發送聊天消息,數據格式為?"msg:did?you?have?dinner";//登錄的指令NSString?*loginStr?=?@"iam:zhangsan";//把Str轉成NSDataNSData?*data?=?[loginStr?dataUsingEncoding:NSUTF8StringEncoding];[_outputStream?write:data.bytes?maxLength:data.length];
}
#pragma?mark?讀了服務器返回的數據
-(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];[self?reloadDataWithText:recStr];
}
-(BOOL)textFieldShouldReturn:(UITextField?*)textField{NSString?*text?=?textField.text;//?聊天信息NSString?*msgStr?=?[NSString?stringWithFormat:@"msg:%@",text];//把Str轉成NSDataNSData?*data?=?[msgStr?dataUsingEncoding:NSUTF8StringEncoding];//?刷新表格[self?reloadDataWithText:msgStr];//?發送數據[_outputStream?write:data.bytes?maxLength:data.length];//?發送完數據,清空textFieldtextField.text?=?nil;return?YES;
}
-(void)reloadDataWithText:(NSString?*)text{[self.chatMsgs?addObject:text];[self.tableView?reloadData];//?數據多,應該往上滾動NSIndexPath?*lastPath?=?[NSIndexPath?indexPathForRow:self.chatMsgs.count?-?1?inSection:0];[self.tableView?scrollToRowAtIndexPath:lastPath?atScrollPosition:UITableViewScrollPositionBottom?animated:YES];
}
#pragma?mark?表格的數據源
-(NSInteger)tableView:(UITableView?*)tableView?numberOfRowsInSection:(NSInteger)section{return?self.chatMsgs.count;
}
-?(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath{static?NSString?*ID?=?@"Cell";UITableViewCell?*cell?=?[tableView?dequeueReusableCellWithIdentifier:ID];cell.textLabel.text?=?self.chatMsgs[indexPath.row];return?cell;
}
-(void)scrollViewWillBeginDragging:(UIScrollView?*)scrollView{[self.view?endEditing:YES];
}
@end
服務器在github上?,可以自己下載的玩玩。本人java剛入門,只能到這,可以在這個服務器的基礎上擴展下其他功能。