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

时间: 2024-08-19 06:11:54

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

01-socket第三方库 AsyncSocket(GCDAsyncSocket)

[IOS网络通信]socket第三方库 AsyncSocket(GCDAsyncSocket) Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Client)与服务端(server). 1)服务端利用Socket监听端口: 2)客户端发起连接: 3)服务端返回信息,建立连接,开始通信: 4)客户端,服务端断开连接. 1套接字(socket)概念 套接字(s

最全面的iOS和Mac开源项目和第三方库汇总

UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl – XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHou

iOS 开发第三方库全集

拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看"使用方法". (国人写) XHRefreshControl – XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHo

IOS常用第三方库《转》

UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch VPN 完整项目 好的文章 Xcode插件 美工资源 其他资源 开发资源 UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者Collect

iOS 第三方库、插件、知名博客总结

用到的组件1.通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好化时间 MBProgressHUD一款提示框第三方库 MWPhotoBrowser一款简单的 iOS 照片浏览控件 CTAssetsPickerController一个选择器组件, 支持从用户的相片库选择多张照片和视频. QB

FreeSWITCH第三方库(其他)的简单介绍(三)

FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5488890.html ① ldns dns相关的库. ② libre libre 是一个利用异步 I/O 实现的实时通讯库.采用可移植的 POSIX 源码编写,符合 ANSI C89 和 ISO C99 标准. 这

python第三方库requests简单介绍

一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r.status_code) # 获取返回状态 r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'}) #带参数的GET请求 print(r.url) print(r.text) #打印解码后的返回数据 1.带参数

第三方库AFNetworking 3.1.0的简单使用

AFNetworking是一个 在iOS开发中 使用非常多网络开源库.它是一个轻量级的网络请求API类库. 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLConnection ,  NSOperation , 以及其他熟悉的Foundation技术之上. 下面的类已从AFNetworking 3.0中废弃: AFURLConnectionOperation AFHTTPRequestOperation AFHTTPRequestOperationManag

FreeSWITCH第三方库(视频)的简单介绍(二)

FreeSWITCH使用了大量的第三方库,本文档主要介绍视频相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 其他相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5489315.html ① openh264 OpenH264 是思科公司以BSD协议开放的一个开源的 H.264 编码器和解码器. Cisco 将以 BSD 协议开放其 H264 解码器实现,并提供针对主流操作系统