CocoaAsyncSocket��浣跨��

CocoaAsyncSocket����tcp��udp���朵腑锛�

AsyncSocket绫绘������TCP��

AsyncUdpSocket������UDP��

AsyncSocket��灏�瑁�浜�CFSocket��CFSteam��TCP/IP socket缃�缁�搴���瀹���渚�浜�寮�姝ユ��浣�锛�����cocoa绫荤���轰�delegate��瀹��存������涓昏���浠ヤ��规�э�

���������诲���璇诲����锛���涓�����瓒��躲��浣���浠ヨ��ㄥ��璇诲�������ワ�瀹�浼�褰�瀹��������ヤ���

���ㄧ��socket�ユ�躲��濡���浣�璋��ㄥ���ユ�惰��ワ�瀹�灏�涓烘��涓�杩��ュ���ㄦ�扮��瀹�渚�锛�褰��讹�涔���浠ョ���冲�抽��杩�浜�杩��ャ��

濮���锛�delegate锛���������璇���杩��ャ���ユ�躲��瀹��寸��璇诲����瀹��寸�����ャ��杩�搴�浠ュ����寮�杩��ワ��藉��浠ラ��杩�濮���妯″�璋��ㄣ��

�轰�run loop��锛���涓���绾跨������界�跺��浠ュ�ㄤ富绾跨�����宸ヤ�绾跨�涓�浣跨�ㄥ��锛�浣�浣�涓���瑕�杩��峰����瀹�寮�姝ョ��璋��ㄥ����规�锛�浣跨��NSRunLoop��濮����规�����socket�����帮���璁╀��ㄥ�涓�瀹�渚�涓��哄����

�������ㄤ�涓�绫讳腑��浣�������浣�娴�����socket锛�杩�涓�绫诲府浣���浜��ㄩ�ㄣ��

�����轰�IPV4��IPV6��TCP娴�

AsyncUdpSocket��UDP/IP socket缃�缁�搴�锛���瑁���CFSocket��瀹���宸ヤ�寰���TCP����锛���涓�杩����ㄤ�澶���UDP����瀹������轰����诲������������ユ�舵��浣�锛�瀹��寸��濮�������锛��轰�runloop锛���������绫伙�浠ュ������IPV4��IPV6��

浠ヤ���瀹规���规��瀹��圭�绔�����:

http://code.google.com/p/cocoaasyncsocket/wiki/Reference_AsyncSocket

缂�����绀轰���

��澶�宸ヤ�锛�濡�浣���iOS椤圭��涓�浣跨��

�����у��缃��炬�ユ�ц�锛�

http://code.google.com/p/cocoaasyncsocket/wiki/iPhone

�烘��涓���涓ゆ�ワ�

灏�CocoaAsyncSocket椤圭��涓���.h��.m��浠舵���藉�拌��宸遍」����Classes��褰�涓�

娣诲��framework锛�CFNetwork

缂���绠�����TCP杩���

缂���涓�绠�����TCP杩��ュ��ㄣ��HTTP�跺��灏辨��寤虹����TCP��璁�涓�����杩���灏辩�ㄥ��缃�绔���璧疯�锋����峰���搴��ユ�绀恒��

涓轰�褰㈣薄璇存��锛�����宸ユā��涓�涓�HTTP��杩���瑕��ㄥ��telnet宸ュ�凤�杩���涓��戒护琛�宸ュ�凤�濡����ㄥ�戒护琛����诧�

C:\Users\Marshal Wu>telnet

��telnet�� 涓������ㄦ��澶��ㄥ�戒护锛�涔�涓�����杩�琛���绋�搴�

���瑰�����浠躲��

璇存��浣�浣跨�ㄧ����windows vista����windows7锛���涓�windows xp��榛�璁ゅ��瑁�璇ヨ蒋浠剁����

���ㄧ����Mac OSX锛�涓��㈣��甯�杩�涓�宸ュ�枫��濡���浣��虹�颁��㈢����棰�锛�������vista涓�浣跨��telnet����娉�瀹�瑁�telnet��

�跺��锛���浠ヤ娇�ㄨ�涓�宸ュ�峰����socket淇℃��锛�骞舵�ユ��socket杩���淇℃����涓��㈣�翠�涓�姝ラ�わ�濡��撅�

涓��㈢��CocoaAsyncSocket�ュ���般��

棣�����瑕�瀹��扮�稿�崇��delegate锛�

#import

#import "AsyncSocket.h"

@interface SocketDemosViewController : UIViewController

�跺��锛��ㄥ���颁唬��涓�锛�

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{

NSLog(@"did connect to host");

}

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

NSLog(@"did read data");

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

NSLog(@"message is: \n%@",message);

}

AsyncSocketDelegate涓����规��芥������������瀹��颁�瀵瑰缓绔�杩��ュ��浠ュ��璇诲���版����������

杩�浜�������瑕���寤哄��浣跨��AsyncSocket瀹�渚��舵���借��ㄥ�般��涓��㈠氨��杩��ㄥ��浠g��锛�

- (void)viewDidLoad {

[super viewDidLoad];

AsyncSocket *socket=[[AsyncSocket alloc] initWithDelegate:self];

[socket connectToHost:@"www.baidu.com" onPort:80 error:nil];

[socket readDataWithTimeout:3 tag:1];

[socket writeData:[@"GET / HTTP/1.1\n\n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];

����杩��ㄥ��浠g���存�ュ����controller��viewDidLoad涓�浜���

�ц����ュ�濡�涓�锛�

2011-07-19 17:17:46.545 SocketDemos[27120:207] did connect to host

2011-07-19 17:17:46.620 SocketDemos[27120:207] did read data

2011-07-19 17:17:46.621 SocketDemos[27120:207] message is:

HTTP/1.1 200 OK

Date: Tue, 19 Jul 2011 09:17:46 GMT

Server: BWS/1.0

Content-Length: 7691

Content-Type: text/html;charset=gb2312

Cache-Control: private

Expires: Tue, 19 Jul 2011 09:17:46 GMT

Set-Cookie: BAIDUID=9389BA38262D7997D220A564154CCA87:FG=1; expires=Tue, 19-Jul-41 09:17:46 GMT; path=/; domain=.baidu.com

P3P: CP=" OTI DSP COR IVA OUR IND COM "

Connection: Keep-Alive

杩�����HTTP��搴�琚�����浜�锛���涓烘��浠�涓���瑕�缂��������ユ��HTTP��搴������斤���姝よ�涓�缂洪�峰��浠ュ拷�ャ��

����HTTP璇锋�搴�璇ユ���辨���″�ㄧ���ュ�抽��锛�姣�濡�浣跨��telent璁块�����扮����杩��风��缁�灏撅�

��姝わ�HTTP��搴�娌℃��瀹��ㄦ�ユ�朵��ワ����″�ㄧ��������杩��ャ����浠ュ�ㄥ�㈡�风���抽��杩��ワ�杩��凤�

[socket readDataWithTimeout:3 tag:1];

[socket writeData:[@"GET / HTTP/1.1\n\n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];

[socket disconnect];

��澶�锛���浠ュ����delegate涓���杩�涓��规�锛�

- (void)onSocketDidDisconnect:(AsyncSocket *)sock{

NSLog(@"socket did disconnect");

}

杩��峰氨��浠ュ�ㄦ�ュ�涓����у�板�抽��杩��ョ��淇℃����

TCP杩��ヨ�诲����瀹��垮害���版����

socket杩��ワ�缁�甯哥�板�拌��风����姹�锛�璇诲���哄���垮害��瀛�����杩���浠ラ��杩�涓��㈢��绀轰�瀹��般��

杩����轰�HTTP杩��ュ��婕�绀恒��姣�濡���2娆★�姣�娆�50瀛������跺����姝�socket��

��浠ヨ��峰��锛�

- (void)viewDidLoad {

[super viewDidLoad];

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

[socket connectToHost:@"www.baidu.com" onPort:80 error:nil];

data=[[NSMutableData dataWithLength:50] retain];

[socket readDataToLength:50 withTimeout:5 tag:1];

[socket readDataToLength:50 withTimeout:5 tag:2];

[socket writeData:[@"GET / HTTP/1.1\n\n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:3 tag:1];

��delegate涓�锛�涓昏���杩�涓��规�璧蜂���锛�

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

NSLog(@"did read data");

NSString* message = [[[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding] autorelease];

NSLog(@"message is: \n%@",message);

if (tag==2) {

[socket disconnect];

}

}

�ュ�绫讳技杩��凤�

��绾㈣�茬����涓ゆ�″���虹��瀛�����瀹广��

缂������″�ㄧ��Socket

缂���浜�Echo绀轰�锛�璇存����绠��������″�ㄧ��Socket��娉���Echo灏辨����澹帮���杩�telnet����浠�涔�锛����″�ㄧ��灏辫���浠�涔���绫讳技杩��凤�

���″�ㄧ��锛���瑕�����瀹㈡�风����杩��ャ��绛�寰�瀹㈡�风�����ヤ俊����浠g����杩��风��锛�

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

NSError *err = nil;

if ([socket acceptOnPort:4322 error:&err]) {

NSLog(@"accept ok.");

}else {

NSLog(@"accept failed.");

}

if (err) {

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

}

杩�涓�姝ュ�������锛�搴�璇ュ����涓�涓��ュ�淇℃��锛�

2011-07-20 12:27:03.228 SocketDemos[611:707] accept ok.

杩��跺�����瀹㈡�风��涓�涔�寤虹��杩��ワ�姣�濡���杩�telnet��浼�渚�娆¤���AsyncSocket ��delegate��濡�涓��规�锛�

onSocket:didAcceptNewSocket: AsyncSocket��寤轰��扮��Socket�ㄤ�澶�����瀹㈡�风����璇锋�锛�濡���杩�涓���socket瀹�渚�浣�涓���绠�淇���锛�retain锛�锛��d�灏���缁���璇ュ�㈡�风��杩���

onSocket:wantsRunLoopForNewSocket:锛���渚�绾跨���runloop瀹�渚�缁�AsyncSocket锛�����灏�浣跨�ㄨ�涓�runloop�ц�socket��璁�����浣�

onSocketWillConnect:锛�灏�瑕�寤虹��杩��ワ�杩��跺��浠ュ��涓�浜���澶�宸ヤ�锛�濡�����瑕���璇�

onSocket:didConnectToHost:port:锛�杩�涓��规���寤虹��杩��ュ���ц���锛�涓���浼��ㄨ���璋��ㄥ���ユ����璇诲��socket����浣�

��Echo绀轰�涓�锛�涓���绠��ц�澶�绾跨�锛�涔�涓��虫����澶�瀹㈡�风��杩��ワ���涓����″�ㄧ����瀹㈡�风��灏�寤虹���胯��ャ���磋�冲�㈡�风����寮�杩��ワ����″�ㄧ�������剧�稿���socket��

浠g��濡�涓�锛�

- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{

if (!acceptSocket) {

acceptSocket=[newSocket retain];

NSLog(@"did accept new socket");

}

}

- (NSRunLoop *)onSocket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket{

NSLog(@"wants runloop for new socket.");

return [NSRunLoop currentRunLoop];

}

- (BOOL)onSocketWillConnect:(AsyncSocket *)sock{

NSLog(@"will connect");

return YES;

}

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{

NSLog(@"did connect to host");

[acceptSocket readDataWithTimeout:-1 tag:1];

}

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

NSLog(@"did read data");

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

NSLog(@"message is: \n%@",message);

[acceptSocket writeData:data withTimeout:2 tag:1];

}

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{

NSLog(@"message did write");

[acceptSocket readDataWithTimeout:-1 tag:1];

}

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err{

NSLog(@"onSocket:%p willDisconnectWithError:%@", sock, err);

}

- (void)onSocketDidDisconnect:(AsyncSocket *)sock{

NSLog(@"socket did disconnect");

[acceptSocket release];

acceptSocket=nil;

}

杩���timeout璁剧疆涓�-1锛�杩��峰氨��浠ヤ����胯��ョ�舵����

缂���绠�����UDP搴���

棣���锛�缂�������UDP�版���ョ��绀轰���杩���瑕���涓����″�ㄧ���芥�ユ�跺�板��瀹广����Java��浜�涓�绠������ユ�剁��锛�

public static void main(String[] args) throws IOException {

InetSocketAddress address = new InetSocketAddress("0.0.0.0", 5555);

DatagramSocket datagramSocket=new DatagramSocket(address);

System.out.println("start udp server");

byte[] buffer=new byte[1024];

for(;;){

DatagramPacket datagramPacket=new DatagramPacket(buffer, buffer.length);

datagramSocket.receive(datagramPacket);

System.out.println("receive data:"+new String(datagramPacket.getData(),0,datagramPacket.getLength()));

}

}

涓��㈠��������浠g��锛�

AsyncUdpSocket *socket=[[AsyncUdpSocket alloc]initWithDelegate:self];

NSData *data=[@"Hello from iPhone" dataUsingEncoding:NSUTF8StringEncoding];

[socket sendData:data toHost:@"192.168.0.165" port:5555 withTimeout:-1 tag:1];

NSLog(@"send upd complete.");

�ц���锛��ㄦ�ユ�剁������杈��哄�涓���瀹癸�

涓���锛���涓��ユ�剁����浠g��锛�

AsyncUdpSocket *socket=[[AsyncUdpSocket alloc] initWithDelegate:self];

NSError *error = nil;

[socket bindToPort:5555 error:&error];

if (error) {

NSLog(@"error: %@",error);

}

[socket receiveWithTimeout:-1 tag:1];

NSLog(@"start udp server");

��澶�锛��冲���杩�涓�delegate�规�锛�

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock

didReceiveData:(NSData *)data

withTag:(long)tag

fromHost:(NSString *)host

port:(UInt16)port{

NSLog(@"received data: %@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);

return YES;

}

����绔�锛�杩�����java��涓�娴�璇�浠g��锛�

public static void main(String[] args) throws IOException {

DatagramSocket datagramSocket = new DatagramSocket();

byte[] buffer = "Hello!".getBytes();

DatagramPacket datagramPacket = new DatagramPacket(buffer,

buffer.length, new InetSocketAddress("192.168.0.144", 5555));

datagramSocket.send(datagramPacket);

}

��iPhone�ュ�涓�锛�

2011-07-20 15:23:33.571 SocketDemos[795:707] start udp server

2011-07-20 15:23:47.395 SocketDemos[795:707] received data: Hello!

�跺�颁��版���ャ��

浣跨��UDP�������ユ�剁���

杩���涓昏��虫敞�����ユ�讹�涓��归�㈡����姹�涓�瑕�姹�锛���涓��归��锛�纰板�拌�Android Wifi�峰��缁�����棰�锛���蹇�iOS涔���绫讳技���哄�躲�����ユ�璇����版病���d�楹荤��锛���寮�缁�����锛���

涓轰�娴�璇�锛�杩�����java缂���浜�涓�����UDP骞挎����绠���浠g��锛�

public static void main(String[] args) throws IOException {

int port=3333;

MulticastSocket socket=new MulticastSocket(port);

InetAddress address=InetAddress.getByName("239.0.0.1");

socket.joinGroup(address);

byte[] data="Hello everyone.".getBytes();

DatagramPacket datagramPacket=new DatagramPacket(data,data.length,address,port);

socket.send(datagramPacket);

System.out.println("send ok.");

缂�����iOS浠g��锛�

AsyncUdpSocket *socket=[[AsyncUdpSocket alloc] initWithDelegate:self];

NSError *error = nil;

[socket bindToPort:3333 error:&error];

[socket enableBroadcast:YES error:&error];

[socket joinMulticastGroup:@"239.0.0.1" error:&error];

if (error) {

NSLog(@"error: %@",error);

}

[socket receiveWithTimeout:-1 tag:1];

NSLog(@"start udp server");

delegate��涓��㈡�ユ�舵����UDP涓�妯′��凤�

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock

didReceiveData:(NSData *)data

withTag:(long)tag

fromHost:(NSString *)host

port:(UInt16)port{

NSLog(@"received data: %@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);

return YES;

}

你可能感兴趣的:(CocoaAsyncSocket��浣跨��)