GCAsyncSocket 这是一个2003的开发出来的一个开源框架
首先把GCDAsyncSocket的.h和.m文件拖入到工程中
试图控制器遵守GCDAsyncSocketDelegate协议
实例:在页面上有一个简单的textView和textField 在textField中输入文字后,点击发送即可把文字发送到服务器
,服务器端返回的文字数据会显示到textView上
// 服务器主机ip地址 #define kHost @"172.16.3.101" // 服务器主机通信端口 #define kPort 10024 @interface LYViewController ()<GCDAsyncSocketDelegate]]]]> // 创建socket对象,进行通信 @property (nonatomic, strong) GCDAsyncSocket *socket; @property (nonatomic, strong) GCDAsyncSocket *socketServer; // 创建安装socket对象 - (void)_setupSocket; - (void)_setupServerSocket; // - (void)_keyboardFrameChange:(NSNotification *)notification; @end
@implementation LYViewController - (void)viewDidLoad { [super viewDidLoad]; self.textField.delegate = self; [self _setupSocket]; [self _setupServerSocket]; } - (BOOL)prefersStatusBarHidden { return YES; } #pragma mark - 键盘弹起 改变输入框的位置 #pragma mark 注册通知 改变输入框的位置 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_keyboardFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil]; } #pragma mark 移除通知 - (void)viewWillDisappear:(BOOL)animated { [super viewDidDisappear:YES]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillChangeFrameNotification object:nil]; } #pragma mark 接收到键盘弹起通知相应的方法 - (void)_keyboardFrameChange:(NSNotification *)notification { CGRect textFieldRect = self.textField.frame; NSDictionary *userInfo = notification.userInfo; CGRect beginRect = [userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue]; CGRect endRect = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGFloat tempY = CGRectGetMinY(endRect) - CGRectGetMinY(beginRect); textFieldRect.origin.y += tempY; [UIView animateWithDuration:.25 animations:^{ self.textField.frame = textFieldRect; }]; } #pragma mark 点击return 键盘收回 发送消息(写入数据) - (BOOL)textFieldShouldReturn:(UITextField *)textField { NSString *dataString = [self.textField.text stringByAppendingString:@"\r\n"]; NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; [self.socket writeData:data withTimeout:-1 tag:0]; [textField resignFirstResponder]; return YES; } #pragma amrk - private methods // 创建安装socket对象 -(void)_setupSocket { self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; // 连接到服务器 [self.socket connectToHost:kHost onPort:kPort error:nil]; } // 创建服务器对象 - (void)_setupServerSocket { self.socketServer = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; [self.socket acceptOnPort:10024 error:nil]; } #pragma mark - socket delegate // 连接服务器成功 -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { NSLog(@"%s", __FUNCTION__); // 等待读取数据 [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 maxLength:NSIntegerMax tag:0]; } // 读到数据的回调方法 - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; self.textView.text = content; } - (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 maxLength:NSIntegerMax tag:0]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
posted on 2014-07-16 19:34 阅读( ...) 评论( ...)