随笔 - 25  文章 - 0  评论 - 36  阅读 - 64165

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小项目了。

posted on   橙子瓣  阅读(1555)  评论(6编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
< 2025年2月 >
26 27 28 29 30 31 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 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示