博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架
阅读量:7283 次
发布时间:2019-06-30

本文共 3466 字,大约阅读时间需要 11 分钟。

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 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/liuyu521/p/3849463.html

你可能感兴趣的文章
Apache HTTP配置反向代理入门
查看>>
Linux IPC实践(2) --匿名PIPE
查看>>
LeetCode - 11. Container With Most Water
查看>>
即时数据模块设计说明-前言
查看>>
编程知识普及(持续更新中)
查看>>
Gradle 1.12用户指南翻译——第五十九章. 组织构建逻辑
查看>>
一个动态权限库的设计
查看>>
java实现顺序栈
查看>>
关于 Android 默认字体以及对比微软雅黑字体
查看>>
IntelliJ IDEA像Eclipse一样打开多个项目(转)
查看>>
<实战>在centos中架设samba服务器,并通过windows平台访问
查看>>
二叉树广度优先搜索,并且实现打印二叉树
查看>>
CacheDependency、SqlCacheDependency Asp.net 2.0和Sql的缓存管理和使用
查看>>
Java中的Get和Post请求,使用万网接口判断域名是否已被注册
查看>>
【OpenCV学习】形态学梯度
查看>>
最佳黑色背景的Visual Studio 2005/2008配置-尤其适合开发人员使用
查看>>
arcgis server 10.1 发布动态图层展示海量及频繁更新的数据步骤
查看>>
IBatis.Net学习笔记二--下载、编译、运行NPetShop
查看>>
两天完成一个小型工程报价系统(三层架构)
查看>>
单数据库,多数据库,单实例,多实例不同情况下的数据访问效率测试
查看>>