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;
}