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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM