zoukankan      html  css  js  c++  java
  • Socket在iOS客户端上的简单实现

    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:@" "];
        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
     
  • 相关阅读:
    深度学习的一些思考
    卷积神经网络CNN
    使用seaborn探索泰坦尼克号上乘客能否获救
    问题记录贴
    相机标定
    docker的--net=host有什么用
    深度学习在3D点云处理中的探索
    python fire使用指南
    ssh配置免密登录及连接远程主机的container
    xavier安装jetpack
  • 原文地址:https://www.cnblogs.com/liuyu521/p/3849463.html
Copyright © 2011-2022 走看看