您的位置:首页 > 理论基础 > 计算机网络

网络编程socket(服务端简单模拟)(OC)

2016-06-23 21:31 435 查看
现在直播这么火,了解socket,甚至对于开发对应的直播软件都是非常重要的;所以,在这里,记录一下一个服务端的简单模拟代码:

int main(int argc, const char * argv[]) {
@autoreleasepool {
LZP_socket * socket = [[ppp alloc] init];
[socket start];
[[NSRunLoop mainRunLoop] run];
//如果不开启主循环,开启服务器后会立马关闭;
}
return 0;
}


说明:服务器端是一直保持运行状态,如果不开启主循环,服务器对象刚创建就会die;

#import "LZP_socket.h"
#import "GCDAsyncSocket.h"

@interface LZP_socket()<GCDAsyncSocketDelegate>
@property(strong, nonatomic) GCDAsyncSocket * socket;
@property(strong, nonatomic)NSMutableArray * clientArray;
@end

@implementation LZP_socket
-(NSMutableArray *)clientArray{
if (_clientArray == nil) {
_clientArray = [NSMutableArray array];
}
return _clientArray;
}
-(void)start{
//该方法是用来开启socket服务端;
//创建一个socket对象/如果该
4000
对象不进行全局属性保存,作用域就是该方法内部,无法持续性开启...
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];

NSError * error = nil;
[self.socket acceptOnPort:5333 error:&error];
if (error != nil) {
NSLog(@"链接失败");
}else{
NSLog(@"服务已经开启");
}

}
//该方法是socket代理方法,用来监听接受的客户端;
-(void)socket:(GCDAsyncSocket *)serverSocket didAcceptNewSocket:(GCDAsyncSocket *)clientsock{
//监听到的客户端,如果不采取措施保存,也会在方法结尾处die,所以使用一个数组,将各个链接服务端的客户端保存起来;
[self.clientArray addObject:clientsock];

NSLog(@"%lu",(unsigned long)self.clientArray.count);
//监听客户端输入
[clientsock readDataWithTimeout:-1 tag:0];

}
//该刚发是用来监听客户端的输入;
-(void)socket:(GCDAsyncSocket *)clientsock didReadData:(NSData *)data withTag:(long)tag{

NSString * dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",dataStr);
[clientsock readDataWithTimeout:-1 tag:0];
for (GCDAsyncSocket * sock in self.clientArray) {
if (clientsock != sock) {//除了自己外的其他客户端接收自己发的信息
//将信息发送给其他的客户端sock;
[sock writeData:data withTimeout:-1 tag:0];
}
}}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  软件 socket 网络编程