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

来源:互联网 发布:php面向对象 实战项目 编辑:程序博客网 时间:2024/05/17 23:18

现在直播这么火,了解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对象/如果该对象不进行全局属性保存,作用域就是该方法内部,无法持续性开启...    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
0 0
原创粉丝点击