iPhone开发之网络编程 AsyncSocket

来源:互联网 发布:淘宝血滴子买家秀 编辑:程序博客网 时间:2024/05/29 07:34

iPhone开发之网络编程 AsyncSocket

源地址::http://www.open-open.com/lib/view/open1338595161095.html

iphone的CFNetwork编程比较艰深。使用AsyncSocket开源库来开发相对较简单,下面介绍一些简单的使用,并给出一个简单的实现模板,只要添加自己的处理代码就可以使用了。

 

项目主页:http://code.google.com/p/cocoaasyncsocket/

一.项目添加ASyncSocket

  1.下载ASyncSocket库源码

  2.把ASyncSocket库源码加入项目

  3.在项目增加CFNetwork框架

二.功能介绍

 1.在需要联接地方使用connectToHost联接服务器

其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.

asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];

NSError *err = nil;

if(![asyncSocket connectToHost:host on:port error:&err])

{

     NSLog(@"Error: %@", err);

}

2.增加Socket响应事件

   因为initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法.

   关于NSData对象

   无论SOCKET收发都采用NSData对象.它的定义是

   NSData主要是带一个(id)data指向的数据空间和长度 length.

   NSString 转换成NSData 对象

   NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];

   NSData 转换成NSString对象

   NSData * data;

   NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

3.发送数据

AsyncSocket  writeData    方法来发送数据,它有如下定义

- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;

以下是一个实例语句.

NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];

[sock writeData:aData withTimeout:-1 tag:1];

4.接收Socket数据.

在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.

-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

在中间将其转换成NSString进行显示.

NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"===%@",aStr);

[aStr release];

 

三.实现模板,将直接的代码添加进入就可以使用了

 

?
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#import "AsyncSocket.h"
 
#define theEndTag 255
 
@implementation SocketComm
 
//初始话,创建socket
 
- (id) init
 
{
 
    self = [super init];
 
    if(self != nil) {
 
    _sock = [[AsyncSocket alloc] initWithDelegate:self];
 
    [_sock setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
 
    }
 
    returnself;
 
}
 
//发送数据
 
-(void)writeDataOnMainThread:(id)string
 
{
 
    NSData *cmdData = [string dataUsingEncoding:NSUTF8StringEncoding]
 
    [_sock writeData:data withTimeout:-1 tag:0];
 
}
 
//打开
 
- (NSInteger)SocketOpen:(NSString*)addr port:(NSInteger)port
 
{
 
    if(![_sock isConnected])
 
    {
 
    [_sock connectToHost:addr onPort:port withTimeout:timeout error:&err];
 
    NSLog(@"connect to Host:%@ Port:%d",addr,port);
 
    }
 
    return0;
 
}
 
//写数据
 
- (NSInteger)SocketWrite:(NSString*)cmd level:(NSInteger)level
 
{
 
    if([_sock isConnected])
 
    {
 
    //处理发送数据,加入队列等待发送
 
    }
 
    else
 
    {
 
    NSLog(@"Offline!");
 
    }
 
    return0;
 
}
 
//关闭
 
- (NSInteger)SocketClose
 
{
 
    if([_sock isConnected])
 
    {
 
    [_sock writeData:Data withTimeout:-1 tag:theEndTag];
 
    [_sock disconnectAfterReadingAndWriting];
 
    }
 
    return0;
 
}
 
#pragma mark -
 
#pragma mark Delegate
 
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
 
{
 
    NSLog(@"willDisconnectWithError:%@",err);
 
}
 
- (void)onSocketDidDisconnect:(AsyncSocket *)sock
 
{
 
    NSLog(@"onSocketDidDisconnect");
 
}
 
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
 
{
 
    NSLog(@"didConnectToHost");
 
    //这是异步返回的连接成功,
 
    [sock readDataWithTimeout:-1 tag:0];
 
}
 
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
 
{
 
    NSString *msg = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
 
    if(msg)
 
    {
 
    //处理受到的数据
 
    }
 
    else
 
    {
 
    NSLog(@"Error converting received data into UTF-8 String");
 
    }
 
    [sock readDataWithTimeout:-1 tag:0];
 
}
 
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
 
{
 
    NSLog(@"didWriteDataWithTag:%d",tag);
 
}
 
@end

0 0
原创粉丝点击