使用asyncsocket群聊
#import "ViewController.h"
#import "AsyncSocket.h"
@interface ViewController ()<AsyncSocketDelegate,UITextFieldDelegate>
{
//负责显示接受到的数据
UITextView *_textView;
//负责输入数据
UITextField *_textField;
//建立发送端
AsyncSocket * sendSocket;
//建立服务端
AsyncSocket *serverSocket;
}
//建立一个数组保存连接
@property (nonatomic,strong) NSMutableArray *socketArray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/**
* 建立一个群聊,学生向老师端发送消息,老师端则显示全部信息
*/
self.socketArray = [NSMutableArray arrayWithCapacity:0];
[self createSocket];
//创建界面
[self createView];
//创建一个定时器,没隔10秒清除一次数据
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(clearTextView) userInfo:nil repeats:YES];
}
- (void)clearTextView{
_textView.text = nil;
}
- (void)createView{
_textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 240)];
_textView.backgroundColor = [UIColor blackColor];
_textView.textColor = [UIColor whiteColor];
[self.view addSubview:_textView];
_textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 240, self.view.frame.size.width, 44)];
_textField.delegate = self;
_textField.backgroundColor = [UIColor redColor];
[self.view addSubview:_textField];
}
- (void)createSocket{
sendSocket = [[AsyncSocket alloc]initWithDelegate:self];
serverSocket = [[AsyncSocket alloc]initWithDelegate:self];
//服务端绑定port,监听该port接受的数据
/**
* port最大为65535。当中建议设置为5000以上,另外另一些特殊的port,比如8080为视频port。建议不要占用
*/
[serverSocket acceptOnPort:5678 error:nil];
}
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
//接受的一个新连接,这个新连接须要保存一下。然后持续保持连接
[self.socketArray addObject:newSocket];
//当中-1表示持续观察,假设设置为300,那么300秒以后就不再观察
[newSocket readDataWithTimeout:-1 tag:100];
}
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
//接受到的数据
NSString *message = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
if (_textView) {
//在原来的旧数据上面。追加新的 数据
_textView.text = [NSString stringWithFormat:@"%@%@",_textView.text,message];
}
[sock readDataWithTimeout:-1 tag:100];
}
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{
//发送成功
}
//发送数据
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
if (textField.text.length > 0 ) {
//发送数据
if (![sendSocket isConnected]) {
//确定是否连接。假设没有连接,则開始连接
[sendSocket connectToHost:@"10.8.155.176" onPort:5678 error:nil];
}
//当连接完毕以后。发送数据
//拼接数据是谁说,我希望获得当前设备的名称
// [[UIDevice currentDevice]systemName];该方法仅仅有在真机上才有效。在模拟器上无效
NSString *message = [NSString stringWithFormat:@"%@说:%@",@"房骞",textField.text];
[sendSocket writeData:[message dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:100];
}
return YES;
}
@end
使用asyncsocket群聊的更多相关文章
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- smack 4.1创建群聊
smack 4.1.1版本对群聊修改了很多,MultUserChat的构造函数修改成了私有,以前通过new MultUserChat创建聊天室,现在通过MultUserChatMananger先通过r ...
- Socket通信 简单实现私聊、群聊(dos命令下)
很久以前的一个Demo,这里服务器只做转发功能,根据ID地址和端口号来标识身份,群聊和私聊只是简单实现, 服务器代码如下: import java.util.*; import java.io.*; ...
- Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)
XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊 ...
- 一例完整的websocket实现群聊demo
前言 业余我都会花一些时间在tcp.http和websocket等领域的学习,现在觉得有点收获,所以把一个基于websocket的群聊功能的例子提供给大家玩玩.当然这是一个很完整的例子,包括webso ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。
上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户 ...
- 阿里百川IMSDK--自定义群聊界面
// 获取群对象 YWTribe *tribe = [self.tribesArray objectAtIndex:indexPath.row]; // 发起群聊 UIViewController * ...
- Java-->实现群聊功能(C/S模式--TCP协议)
--> Java 对TCP协议的支持: --> java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端. -- ...
- 【从0開始Tornado建站】群聊
群聊的前台主要代码: {%block content%} <!--<p class='text-success h3'>測试版本号,每天凌晨4:00清水,enjoy it~~:-)& ...
随机推荐
- WPF TextBox按字节长度限制输入
前两天做一个项目的时候,由于页面没有限制TextBox的输入长度,所以,后台直接报错了,超出数据库最大的长度. 数据库的长度是按照字节来计算的,而且不同的编码格式,汉字占用的字节长度又不相同,比如,我 ...
- Javascript数组求和的方法总结 以及由斐波那契数列得到的启发
一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以 ...
- 10个鲜为人知的C#关键字
在正式开始之前,我需要先声明:这些关键字对于偏向底层的程序员更加耳熟能详,对这些关键字不了解并不影响你作为一个合格的程序员. 这意味着这些关键字会让你在编写程序时得到更好的代码质量和可读性,enjoy ...
- Dijkstra算法(Swift版)
原理 我们知道,使用Breadth-first search算法能够找到到达某个目标的最短路径,但这个算法没考虑weight,因此我们再为每个edge添加了权重后,我们就需要使用Dijkstra算法来 ...
- nginx负载均衡简单配置
nginx负载均衡简单配置准备三台虚拟机来做这个实验:192.168.232.132 web服务器192.168.232.133 web服务器192.168.232.134 ...
- java equals 和 == 的区别
)1. == 可以用来比较基本类型以及引用类型.在基本类型中 == 比较的是两个变量的值是否相等.在引用类型中,== 比较的是两个对象的内存地址是否相等. )2. equals 只能用来比较引用类型. ...
- Bin、App_Data等文件夹详述(转自http://blog.csdn.net/zzjiadw/article/details/6801506)
ASP.NET应用程序和ASP.Net网站所共有的文件: App_Browsers 包含 ASP.NET 用于标识个别浏览器并确定其功能的浏览器定义 (.browser) 文件.有关更多信息,请参见浏 ...
- 十、Hadoop学习笔记————Hive与Hbase以及RDBMS(关系型数据库)的关系
Hive目的是为了简化MapReduce编程 实际应用中,Hive与Hbase不经常链接
- 微信公众号批量爬取java版
最近需要爬取微信公众号的文章信息.在网上找了找发现微信公众号爬取的难点在于公众号文章链接在pc端是打不开的,要用微信的自带浏览器(拿到微信客户端补充的参数,才可以在其它平台打开),这就给爬虫程序造成很 ...
- 单节点下使用docker部署consul
部署consul 目前Consul使用的版本是: v1.0.1 本教程适用于刚刚开始学习consul并简单使用consul的同学,可以在短时间内了解conusl,配合官方文档https://www.c ...