@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

这几天开始学xmpp,先做了超级简易版,以后慢慢加强

因为是简易的,服务器也是简易的,用py脚本写的服务器

因为我是拿来用的就不放上源码了

首先StoryBoard上面拖一些控件,都是简单的,然后加一下约束,这里就不详细说了

比较要注意的是这里我们把输入框容器view的底部约束连线,等下会用到

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewConstraint;

连接服务器部分我们要定义输入输出流然后加入到runloop中去,记得结束连接的时候要移除

- (IBAction)connentToHost:(UIBarButtonItem *)sender

{

NSString *host = @"10.82.197.21";

int port = 12345;

CFReadStreamRef redStream;

CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &redStream, &writeStream);

_inputStream = (__bridge NSInputStream *)(redStream);

_outputStream = (__bridge NSOutputStream *)(writeStream);

_inputStream.delegate = self;

_outputStream.delegate = self;

[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

[_inputStream open];

[_outputStream open];

}

[_inputStream close];

[_outputStream close];

[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

然后是登陆,要把NSString转换生NSData

- (IBAction)loginBtnClick:(UIBarButtonItem *)sender

{

//登陆发送数据格式为“iam:username”

//发送消息数据格式为“msg:message”

NSString *loginStr = @"iam:HJ";

NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];

[_outputStream write:data.bytes maxLength:data.length];

}

我们会实现输入框的代理

UITextFieldDelegate

这样就能够监听确定按钮来发送消息了

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

NSString *msgStr = [NSString stringWithFormat:@"msg:%@",textField.text];

NSData *data = [msgStr dataUsingEncoding:NSUTF8StringEncoding];

[_outputStream write:data.bytes maxLength:data.length];

[self reloadData:msgStr];

textField.text = nil;

return YES;

}

这里输入框位置调整的方法比较新,首先我们监听键盘通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbFrmWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

然后在键盘将要弹出的时候改变约束的值

- (void)kbFrmWillChange:(NSNotification *)noti

{

//获取窗口高度

CGFloat windowsH = [UIScreen mainScreen].bounds.size.height;

//键盘结束的y

CGRect kbEnfFrm = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

self.inputViewConstraint.constant = windowsH - kbEnfFrm.origin.y;

}

代码其他部分就不细说了,我把代码上传了github了:

https://github.com/hjandyz/XMPP

[XMPP]简易的聊天室实现[一]的更多相关文章

  1. [XMPP]简易的聊天室实现[二](使用CocoaAsyncSocket)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  2. 通信——基于Xmpp协议实现的聊天室

    前段时间写了个自定义通信协议的聊天室(即用\r\n标记字符串,作为一句话),总感觉自己弄的那个协议实现虽然简单,但是拓展性就太差了,只适合于发送聊天的内容,难以包含更多的信息.基于上述几点,于是就开始 ...

  3. C 基于UDP实现一个简易的聊天室

    引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...

  4. redis实现简易在线聊天室

    redis_flask简易聊天室 项目构建 这时一个基于Redis数据库的简单小项目,使用redis缓存数据,并通过flask部署到浏览器,运行截图如下: 输入名字后,就可以登陆到聊天室,主要包括三个 ...

  5. golang简易版聊天室

    功能需求: 创建一个聊天室,实现群聊和单聊的功能,直接输入为群聊,@某人后输入为单聊 效果图: 群聊:   单聊: 服务端: package main import ( "fmt" ...

  6. TCP实现一个简易的聊天室 (Unity&&C#完成)

    效果展示 TCP Transmission Control Protocol 传输控制协议 TCP是面向连接的流模式(俗称:网络流).即传输数据之前源端和终端建立可靠的连接,保证数据传输的正确性. 流 ...

  7. UDP实现一个简易的聊天室 (Unity&&C#完成)

    效果展示(尚未完善) UDP User Data Protocol 用户数据报协议 概述 UDP是不连接的数据报模式.即传输数据之前源端和终端不建立连接.使用尽最大努力交付原则,即不保证可靠交付. 数 ...

  8. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

  9. C#基于Socket的简单聊天室实践

    序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...

随机推荐

  1. opencv中cvCreateImage大图片时出错

    最近在做遥感图像的图像处理工作,使用了 OpenCV2.4.8来处理.遥感图像不同于一般图像的一个大的特点是图片容量超大,轻轻松松就能超过10000x10000个像素点,在OpenCV中使用cvCre ...

  2. C++----练习--整型赋值时的溢出

    1.如果所赋的值超出了类型的取值范围.那么只保留最低位 #include<iostream> int main() { ; //unsigned char c = 256; 有无符号都是一 ...

  3. mongodb操作记录

    [User]1.db.addUser("name","pwd","true/false")2.db.auth("name" ...

  4. KEIL C51中const和code的使用

    code是KEIL C51 扩展的关键字,用code修饰的变量将会被放到CODE区里.但C语里的const关键字好像也有定义不能改变的变量的功能,这两个关键字有什么区别呢?在帮助手册里查找const, ...

  5. SqlServer sysobjects_table

    --这是查询所有表的信息 select * from sysobjects where xtype='U'; --这是查询表的数量 select count(*) from sysobjects wh ...

  6. 【Razor语法规则小手册....】

    在经过长达半年的Windows开发后,Razor的一些语法有些生疏了.搜集些,再熟悉下.呵呵,甚是怀念以前做web 项目的时候,基于动软代码生成器自定义T4模板,后来vs2010后开始支持T4模板. ...

  7. IOS 添加到通讯录

    addressBookHelper.h #import <Foundation/Foundation.h> enum { ABHelperCanNotConncetToAddressBoo ...

  8. 怎样给你的Android 安装文件(APK)减肥

    转自: http://greenrobot.me/devpost/putting-your-apks-on-diet/ Android的apk文件越来越大了这已经是一个不争的事实. 在Android ...

  9. 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone

    一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M  (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...

  10. NDK下 将Platinum SDK 编译成so库 (android - upnp)

    Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/U ...