Socket第三方库AsyncSocket实现简单的点对点通信聊天

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket第三方库AsyncSocket实现简单的点对点通信聊天相关的知识,希望对你有一定的参考价值。

首先声明,我是个菜鸟,之所以写点随笔,是因为自己在开发的过程中遇到过这方面的难题,第一次接触,完全一片空白,因为之前请求数据的时候一直用的是http协议,所以没用过TCP,后来 查了很多资料,才慢慢理清了头绪,发现其实也不是很难,就是里面的几个方法。我只是初步了解,写这个也是希望能够让自己对此加深印象,也是在见证着自己慢慢进步吧。所以有不喜欢的大神勿喷哈,谢谢。

一般的做即时通讯,都会用到第三方,比如说融云,环信啊什么的,但是我们的项目需求就是不让用第三方,没办法,所以只能自己写了。也正是因此,才研究了一下socket。

Socket描述了一个IP、端口对。它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息。所以,Socket一定包含了通信的双发,即客户端(Client)与服务端(server)。

实现过程:

1)服务端利用Socket监听端口;

2)客户端发起连接;

3)服务端返回信息,建立连接,开始通信;

4)客户端,服务端断开连接。

上面的是书面的解释,我的理解就是分4步,1,和服务器建立长连接,需要用到IP和端口,具体方法看下面介绍  

                                                         2,建立了长连接就能发送消息了,把要发的消息,和向谁发(目的客户端的ID)传给服务器,格式需要交互,下面也介绍了                                                          3,接受消息,把它展现出来  

                                                         4,断开连接,这就很容易了

在项目中:

首先导入AsyncSocket第三方库,具体就是-打开终端--pod search AsyncSocket(前提是你的电脑支持cocoapods,具体的就不多说了)查看版本--cd 到你的当前项目中--vim Podfile--点击i进行编辑 target ‘APPname‘ do   pod ‘CocoaAsyncSocket‘ ‘~>7.4.3‘  end---pod install。到这就OK了,你点开项目,就会发现成功导入了cocoapodAsyncSocket

----------------------------------------在项目的.m中导入头文件----------------------------------- 

#import "AsyncSocket.h"

//定义IP和端口号

#define HOST_IP @"192.168.16.123"

#define HOST_PORT 8282

定义几个宏定义

#define SRV_CONNECTED 0

#define SRV_CONNECT_SUC 1

#define SRV_CONNECT_FAIL 2

//设置读取超时 -1 表示不会使用超时

#define READ_TIME_OUT -1

#define MAX_BUFFER 1024

 

 定义一个socket,我给他取得名字是client

@property (nonatomic, retain) AsyncSocket *client;

定义输入的信息框,和接受消息的消息框

@property (nonatomic, retain) UITextField *inputMsg;

@property (nonatomic, retain) UILabel *outputMsg;

-------------------------------------------------具体实现-------------------------------------------------

在viewDidLoad里面写上建立长连接的方法

     //建立长连接

    [self connectServer:HOST_IP port:HOST_PORT];

方法的具体实现--

- (int) connectServer: (NSString *) hostIP port:(int) hostPort{

    

    if (client == nil) {

        client = [[AsyncSocket alloc] initWithDelegate:self];

        NSError *err = nil;

        //192.168.16.123

        if (![client connectToHost:hostIP onPort:hostPort error:&err]) {

            

            NSLog(@"%ld %@", (long)[err code], [err localizedDescription]);

            

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Connection failed to host "

                                                                     stringByAppendingString:hostIP]

                                                            message:[[[NSString alloc]initWithFormat:@"%ld",(long)[err code]] stringByAppendingString:[err localizedDescription]]

                                                           delegate:self

                                                  cancelButtonTitle:@"OK"

                                                  otherButtonTitles:nil];

            [alert show];

            return SRV_CONNECT_FAIL;

        } else {

            NSLog(@"Conectou!");

            return SRV_CONNECT_SUC;

        }

    }

    else {

        [client readDataWithTimeout:-1 tag:0];

        return SRV_CONNECTED;

    }

 }

和服务器建立了长连接后就可以发送消息了

具体实现(nsstring里面的格式是和后台交互的,target是目的客户端的ID ;type规定的是向个人发,还是群发,这里是向个人发;content就是发送的内容了)

-(void)sendBtnDidClick

{

    NSString *editMsgStr = [NSString stringWithFormat:@"{\"target\":\"3\",\"type\":\"userText\",\"content\":\"%@\"}",self.editing.text];

    NSString * content1 = [editMsgStr stringByAppendingString:@"\r\n"];

    NSData *data = [content1 dataUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"editing---%@",content1);

    NSLog(@"data1---%@",data);

    [client writeData:data withTimeout:-1 tag:0];

}

//发送消息成功之后回调

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

{

    NSLog(@"发送消息成功");

    self.editing.text = nil;

}

//接受消息成功之后回调

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

    NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"Hava received datas is :%@",aStr);

    self.outputMsg.text = aStr;

    [client readDataWithTimeout:-1 tag:0];

}

好了,到这基本上就结束了,这时候你就会发现,最最最最最原始的QQ出来了,哈哈。

感谢各位大神的博客技术支持,想要看更详细的,我粘贴上我之前看过的大神的博客http://blog.csdn.net/xuqiang918/article/details/16864203

以上是关于Socket第三方库AsyncSocket实现简单的点对点通信聊天的主要内容,如果未能解决你的问题,请参考以下文章

iOS--(转)socket编程之Asyncsocket详解

iOS:基于Socket的第三方框架CocoaAsyncSocket的使用

iOS_SN_Socket - AsyncSocket

iOS开发之即时通讯之Socket(AsyncSocket)

iOS开发之即时通讯之Socket(AsyncSocket)

iOS开发之即时通讯之Socket(AsyncSocket)