标签:
首先声明,我是个菜鸟,之所以写点随笔,是因为自己在开发的过程中遇到过这方面的难题,第一次接触,完全一片空白,因为之前请求数据的时候一直用的是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实现简单的点对点通信聊天
标签:
原文地址:http://www.cnblogs.com/angelove1014/p/5610956.html