本文并不是讲述如何用原始的socket进行通信,而是用第三方类库AsyncSocket。它对socket进行了封装,使得TCP通信简单了许多,方便我们开发,个人认为若要认真学习TCP/IP,最好别用第三方库。本文简述如何用这个第三方库来进行多人聊天
1.准备工作
进行网络开发,系统库是少不了的,导入CFNetWork.framework。
将AsyncSocket库添加到我们的项目里面
再添加头文件
#import "AsyncSocket.h"
添加代理协议 AsyncSocketDelegate为了快速演示,我们不再用代码布局UI,所以创建ViewController时,勾上xib选项。上边是两个TextField,和两个Button,下边是TextView布局如下:
2.实现部分
在 ViewController.h 声明成员变量和事件
IBOutlet UITextField* _ipFiled;//IP
IBOutlet UITextField* _textFiled;//send message
IBOutlet UITextView* _textView;//receive message
//客户端
AsyncSocket* _sendSocket;
//服务端
AsyncSocket* _recvSocket;
NSMutableArray* _socketArray;
//连接
- (IBAction)conToHost:(id)sender;
//发送
- (IBAction)sendText:(id)sender;
这里别忘了要将控件和对象进行绑定。
其余代码如下:
- (void)viewDidLoad
{
[super viewDidLoad];
_socketArray = [[NSMutableArray alloc] init];
//服务端
_recvSocket = [[AsyncSocket alloc] initWithDelegate:self];
//监听客户端来连接
[_recvSocket acceptOnPort:5678 error:nil];
//客户端
_sendSocket = [[AsyncSocket alloc] initWithDelegate:self];
}
//监听到客户端连接
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
[_socketArray addObject:newSocket];
//等待客户端发送消息
[newSocket readDataWithTimeout:-1 tag:0];
}
//监听到客户端发送消息
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
//处理客户端发来的消息 data
NSString* str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
/*
ip:你吃饭了
ip:121.2.3.90
*/
_textView.text = [NSString stringWithFormat:@"%@%@:%@\n", _textView.text, sock.connectedHost, str];
//继续监听客户端发送消息
[sock readDataWithTimeout:-1 tag:0];
}
//客户端
//连接到服务端
- (void)conToHost:(id)sender
{
//如果是连接状态,先断开连接
if (_sendSocket.isConnected)
{
[_sendSocket disconnect];
}
//连接
[_sendSocket connectToHost:_ipFiled.text onPort:5678 withTimeout:30 error:nil];
}
//连接成功
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"连接成功");
}
完整Demo在这里。如果没有积分请留邮箱。