美文网首页
iOS通过socket通信

iOS通过socket通信

作者: 大江哥哥 | 来源:发表于2017-06-21 16:48 被阅读0次

前几天,公司有一个长连接的需求。需要在移动端搭建一个服务器,一边后台可以给推送消息。通过从网上查找资料,终于现在弄出一套自己的服务,包括客户端。

首先我是使用CAsyncSocket类来搭建的。我们可以用pod,也可已用手托。它都是在CocoaAsyncSocket库下。pod的方法pod 'CocoaAsyncSocket’,手动拖得我是从GCD里面拖得。
首先是服务端

@interface MyViewController ()<GCDAsyncSocketDelegate>

//开启服务按钮,主要是为效果展示而用
@property (weak, nonatomic) IBOutlet UIButton *button;
// 服务器socket
@property (nonatomic, strong) GCDAsyncSocket *serverSocket;
// 为客户端生成的socket
@property (nonatomic, strong) GCDAsyncSocket *clientSocket;
@end

因为是用xib拖拽的按钮,所以在此按钮的点击事件开启服务功能

- (IBAction)clickButton:(id)sender { // 1. 创建服务器socket self.serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; // 2. 开放端口 NSError *error = nil; BOOL result = [self.serverSocket acceptOnPort:30000 error:&error]; // 3. 判断端口号是否开放成功 if (result) { NSLog(@"端口开放成功"); } else { NSLog(@"端口开放失败"); } }

服务端实现我们所用类的代理方法了

#pragma mark - GCDAsyncSocketDelegate
//当客户端链接服务器端的socket, 为客户端单生成一个socket
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{ NSLog(@"链接成功"); //IP: newSocket.connectedHost //端口号: newSocket.connectedPort NSLog(@"链接地址:%@", newSocket.connectedHost); NSLog(@"端口号:%hu", newSocket.connectedPort); // 存储新的端口号 self.clientSocket = newSocket; //读取客户端发过来的消息 [self.clientSocket readDataWithTimeout:-1 tag:0]; }

// 服务端接收到消息
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",message); }

好了,这样就可以实现简单开启服务了。里面还有好多的代理方法,我现在是没实现。
接下来是客户端

@interface MyViewController ()<GCDAsyncSocketDelegate> //连接服务时调用按钮 @property (weak, nonatomic) IBOutlet UIButton *linkServer; //发送消息是调用按钮 @property (weak, nonatomic) IBOutlet UIButton *sendMessage; //socket @property (nonatomic, strong) GCDAsyncSocket *socket; @end

//按钮的点击事件,连接服务器
- (IBAction)clickButton:(id)sender { // 1. 创建socket self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; // 2. 与服务器的socket链接起来 NSError *error = nil; BOOL result = [self.socket connectToHost:@"192.168.1.59" onPort:30000 error:&error]; // 3. 判断链接是否成功 if (result) { NSLog(@"客户端链接服务器成功"); } else { NSLog(@"客户端链接服务器失败"); } }

- (IBAction)clickButtonWithSendMessage:(id)sender { NSData *data = [@"我是刘文江" dataUsingEncoding:NSUTF8StringEncoding]; [self.socket writeData:data withTimeout:-1 tag:0]; //这个地方是个单例 ,这样可以保证我们的socket不销毁 JQSocket *socket = [JQSocket defaultSocket]; [socket.mySocket readDataWithTimeout:-1 tag:0]; }

客户端实现我们所用类的代理方法了

// 客户端链接服务器端成功, 客户端获取地址和端口号
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { NSLog(@"链接服务器%@", host); JQSocket *socket = [JQSocket defaultSocket]; socket.mySocket = self.socket; }
// 客户端已经获取到内容
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",content); }

下面去给大家上个效果图
服务器.gif

大家看到了“我是AAAAAA”这条消息就是客户端发过来的。

客户端.gif
今天就说到这里了。友友们有什么问题,可以给我留言,希望对大家有所帮助。

相关文章

  • iOS通过socket通信

    前几天,公司有一个长连接的需求。需要在移动端搭建一个服务器,一边后台可以给推送消息。通过从网上查找资料,终于现在弄...

  • iOS Socket

    iOS Socket重构设计iOS 基于GCDAsyncSocket快速开发Socket通信 Via:宫城_

  • GCDAsyncSocket

    iOS 基于GCDAsyncSocket快速开发Socket通信

  • socket

    iOS 使用 socket 即时通信(非第三方库)简单理解Socket iOS socket网络编程(一) soc...

  • 知识点

    关于Socket通信:客户端通过new Socket()方法创建通信的Socket对象服务器端通过new Serv...

  • CocoaAsyncSocket

    mark:iOS使用CocoaAsyncSocket框架socket通信的demo

  • day017 笔记 08-07

    socket套接字 通过socket实现服务器端 通过socket实现客户端 多次通信(服务器端) 多次通信(客户...

  • 网络基本

    网络通信的要素 socket通过socket来建立连接,然后通信 IP -- Internet Protocol网...

  • iOS 基于GCDAsyncSocket快速开发Socket通信

    原文地址:iOS 基于GCDAsyncSocket快速开发Socket通信 · 宫城 以及Socket重构设计:i...

  • Socket(套接字)

    关于iOS socket都在这里了 Socket概念理解 Socket是一种进程通信机制,凭借这种机制,客户/服务...

网友评论

      本文标题:iOS通过socket通信

      本文链接:https://www.haomeiwen.com/subject/ythtcxtx.html