iOS中Socket編程有實現(xiàn)方式有:
一塔逃、使用系統(tǒng)自帶CFsocket
導(dǎo)入頭文件:
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <unistd.h>
二筋量、利用第三方框架CocoaAsynSocket
1、利用CocoaAsynSocket實現(xiàn)Socket服務(wù)端
#import "ViewController.h"
#import "GCDAsyncSocket/GCDAsyncSocket.h"
@interface ViewController () <GCDAsyncSocketDelegate>
@property(nonatomic,strong) GCDAsyncSocket *serverSocket;
@property(nonatomic,strong) NSMutableArray *clientSocketArray; //保存客服端的所有Socket
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self start];
// [[NSRunLoop currentRunLoop] run]; 調(diào)用運行循環(huán) 保證線程一直開啟
}
-(NSMutableArray *)clientSocketArray
{
if (!_clientSocketArray) {
_clientSocketArray = [NSMutableArray array];
}
return _clientSocketArray;
}
//開啟服務(wù)端監(jiān)聽
-(void)start
{
GCDAsyncSocket *serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
NSError *error = nil;
[serverSocket acceptOnPort:8888 error:&error];
if (!error) {
NSLog(@"服務(wù)端已經(jīng)開啟");
} else {
NSLog(@"服務(wù)端開啟失敗");
}
self.serverSocket = serverSocket; //需要對服務(wù)端Socket進行強引用,否則創(chuàng)建完就銷毀了
}
#pragma mark - 有客戶端鏈接
//sock為服務(wù)端socket,newSocket為客戶端socket
-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
NSLog(@"有客服端連接服務(wù)器%@----%@",sock,newSocket);
[self.clientSocketArray addObject:newSocket]; //需要將客戶端的socket保存到數(shù)組,這樣才能保證newSocket持續(xù)存在
//當(dāng)客戶端一連接成功就發(fā)送數(shù)據(jù)給它
NSMutableString *serverceStr = [NSMutableString string];
[serverceStr appendString:@"歡迎來到10086在線服務(wù),請輸入下面數(shù)組"];
[serverceStr appendString:@"[0]在線充值"];
[serverceStr appendString:@"[4]退出"];
// 向調(diào)用方法的socket寫入數(shù)據(jù)即是這里是向客戶端socket發(fā)送數(shù)據(jù)
[newSocket writeData:[serverceStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
//監(jiān)聽客戶端發(fā)送數(shù)據(jù)
[newSocket readDataWithTimeout:-1 tag:0];
}
#pragma mark - 讀取客戶端請求的數(shù)據(jù)
//當(dāng)一個socket已經(jīng)把數(shù)據(jù)讀入內(nèi)存中時被調(diào)用棺弊。如果發(fā)生錯誤則不被調(diào)用
-(void)socket:(GCDAsyncSocket *)clientSocket didReadData:(NSData *)data withTag:(long)tag
{
//將客戶端輸入的數(shù)據(jù)轉(zhuǎn)化為整數(shù) 根據(jù)數(shù)字回復(fù)不同的內(nèi)容
NSString *tempStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSUInteger num = [tempStr integerValue];
NSString *reseponseStr = nil;
switch (num) {
case 1:
reseponseStr = @"充值話費忙\n";
break;
case 4:
reseponseStr = @"恭喜你成功退出\n";
break;
default:
break;
}
//處理請求返回數(shù)據(jù)給客戶端
[clientSocket writeData:[reseponseStr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
if (num == 4) { //當(dāng)用戶輸入數(shù)字4時 即斷開鏈接只要將客戶端的socket從clientSocketArray中刪除即可
[self.clientSocketArray removeObject:clientSocket];
}
#warning mark - 每次讀完數(shù)據(jù)后都要調(diào)用一次監(jiān)聽數(shù)據(jù)的方法
[clientSocket readDataWithTimeout:-1 tag:0];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
2姨蝴、利用CocoaAsynSocket實現(xiàn)Socket客戶端(未完部蛇,待續(xù))