IOS学习笔记之 Socket 编程
最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”。所以在今天,开始好好学习IOS。(本人之前4年都是搞.Net的,java也培训过一年)
打算学IOS,从哪入手呢?给大家推荐两本入门书吧《Beginning iOS 7 Development》、《Objective-C.程序设计(第4版)》,正好两只手,一手一本。
但是我学习都是先学习基础、理论,但是动手做的时候不要对着书上的例子去学那几个控件的用法,掌握不了所有的,不如用的时候去帮助文档看看用法。即使学会了也只会那几个控件的那几个属性而已,最好是想一个小项目,然后自然而然的就用到了所有控件。
所以今天想编一个socket的例子,虽然简单,但是在做的时候还是遇到了不少小麻烦。
编码前的准备工作:
我是用的xcode6,所以准备socket库的时候使用了支持ARC的GCDAsyncSocket
1、到网上下载GCDAsyncSocket 地址:CocoaAsyncSocket/GCD at master · robbiehanson/CocoaAsyncSocket · GitHub
2、服务器端代码(我已经用.NET写了个简单的)
运行效果:
直接贴上后台代码了:
1、头文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #import <UIKit/UIKit.h> #import "GCDAsyncSocket.h" @interface ViewController : UIViewController { NSString *host; uint16_t port; GCDAsyncSocket *socket; } @property NSTimeInterval socketTimeOut; @property (weak, nonatomic ) IBOutlet UILabel *txtTitle; @property (weak, nonatomic ) IBOutlet UIButton *btnClickMe; @property (weak, nonatomic ) IBOutlet UITextField *txtQQ; @property (weak, nonatomic ) IBOutlet UITextField *txtPwd; @property (weak, nonatomic ) IBOutlet UISlider *sldValue; @property (weak, nonatomic ) IBOutlet UIButton *btnConnectSocket; @property (weak, nonatomic ) IBOutlet UILabel *lblSocketStatus; @property (weak, nonatomic ) IBOutlet UIButton *btnSendMsg; - ( IBAction )btnClickMe_Click:( id )sender; - ( IBAction )txtPwd_DoneEditing:( id )sender; - ( IBAction )sldValue_Changed:( id )sender; - ( IBAction )btnConnectSocket_click:( id )sender; - ( IBAction )btnSendMsg_Click:( id )sender; |
2、m文件变量初始化
1 2 3 4 5 6 7 8 | - ( void )viewDidLoad { [ super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. host = @ "192.168.1.103" ; port = 52710; self .socketTimeOut = 100; } |
3、链接服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //链接socket服务器按钮单击事件 - ( IBAction )btnConnectSocket_click:( id )sender { _lblSocketStatus.text = host; socket = [[GCDAsyncSocket alloc] initWithDelegate: self delegateQueue:dispatch_get_main_queue()]; socket.delegate = self ; NSError *err = nil ; BOOL connState=[socket connectToHost:host onPort:port error:&err]; if (!connState) { _lblSocketStatus.text = [_lblSocketStatus.text stringByAppendingString:err.description ]; } else { NSLog (@ "连接服务器:%@ 成功" ,host); } } |
4、发送信息
1 2 3 4 5 6 | //发送信息单击事件 - ( IBAction )btnSendMsg_Click:( id )sender { [socket writeData:[_txtQQ.text dataUsingEncoding: NSUTF8StringEncoding ] withTimeout:-1 tag:0]; NSLog (@ "发送的QQ号码:%@" ,_txtQQ.text); [socket readDataWithTimeout: self .socketTimeOut tag:0]; } |
这里还调用了
1 | readDataWithTimeout 方法来读取服务器返回的信息<br><br> |
5、接收信息
//读取服务器获取的数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSString *newMessage = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"接收到服务器返回的信息:%@",newMessage);
[socket readDataWithTimeout:self.socketTimeOut tag:0];
}
到此就完成了简单的socket收发信息,可以自己再加工加工完成一个简单的IM小项目了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?