第九块石头

使用CocoaAsyncSocket发送TCP/UDP消息

| Comments

习惯上每次使用一个类库的功能,我第一时间想到的都是Google那个类库的使用例子。这不是一个好习惯,这次我下载了CocoaAsyncSocket的代码,找了好一阵没找到满意的例子。灰心丧气之余想到很多用到我写的代码的人们也是不看文档,不看注释的。他们给我带来了巨大的困扰,而我现在也不看别人的注释和文档,假如CocoaAsyncSocket的作者要为我服务的话,那他肯定也会吐血不止。

于是,我决定自力更生,从代码注释里找找我需要功能的用法。

我需要的功能是,用TCP或者UDP发送一些数据给服务器,不用关心服务器是否收到数据。

下面例子,只是TCP的发送过程,UDP请自行看注释。

TCP连接发送过程中会出现的问题:

1,Host, 端口什么的可能是无意义的值,还没开始connect就已经失败了
2,远程地址连不上,或者中途断线,算作connect失败
3,我上面需要的功能只是发送数据,发送完就没事了,需要在发送完后断开连接

考虑完上面问题,得到的代码如下:

tcp_sender.m
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
#import "GCDAsyncSocket.h"

#define kTCPSenderTag 123

@interface TCPSender()
@property (nonatomic, retain) GCDAsyncSocket *socket;
@end

@implementation TCPSender

+ (void)sendMessage:(NSString *)msg toHost:(NSString *)host port:(UInt16)port {
    [[self alloc] initWithMessage:msg host:host port:port];
}

- (id)initWithMessage:(NSString *)msg host:(NSString *)host port:(UInt16)port {
    self = [super init];
    if (self) {
        if (!msg || !host || !port) {
            [self release];
            return nil;
        }
        self.socket = [[[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()] autorelease];

        NSError *error = nil;
        if (![self.socket connectToHost:host onPort:port error:&error]) {
            self.socket.delegate = nil;
            [self release];
            self = nil;
        } else {
            NSData *msgData = [msg dataUsingEncoding:NSUTF8StringEncoding];
            [self.socket writeData:msgData withTimeout:30 tag:kTCPSenderTag];
        }
    }

    return self;
}

- (void)dealloc {
    if (self.socket && [self.socket isConnected]) {
        [self.socket disconnect];
    }
    self.socket = nil;
    [super dealloc];
}

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag {
    [self.socket disconnect];
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
    [self release];
}

@end

Comments