iOS socket

为什么80%的码农都做不了架构师?>>>   hot3.png

#import "ViewController.h"@interface ViewController ()<NSStreamDelegate,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate>{NSInputStream *_inputStream;//对应输入流NSOutputStream *_outputStream;//对应输出流
}
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewConstraint;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *chatMsgs;//聊天消息数组
@end
@implementation ViewController
-(NSMutableArray *)chatMsgs{if (!_chatMsgs) {_chatMsgs = [NSMutableArray array];}return _chatMsgs;
}
- (void)viewDidLoad {[super viewDidLoad];// 2.收发数据// 做一个聊天// 1.用户登录// 2.收发数据// 监听键盘[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbFrmWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
}
-(void)kbFrmWillChange:(NSNotification *)noti{// 获取窗口的高度CGFloat windowH = [UIScreen mainScreen].bounds.size.height;// 键盘结束的FrmCGRect kbEndFrm = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];// 获取键盘结束的y值CGFloat kbEndY = kbEndFrm.origin.y;self.inputViewConstraint.constant = windowH - kbEndY;
}-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{NSLog(@"%@",[NSThread currentThread]);
//    NSStreamEventOpenCompleted = 1UL << 0,//输入输出流打开完成
//    NSStreamEventHasBytesAvailable = 1UL << 1,//有字节可读
//    NSStreamEventHasSpaceAvailable = 1UL << 2,//可以发放字节
//    NSStreamEventErrorOccurred = 1UL << 3,// 连接出现错误
//    NSStreamEventEndEncountered = 1UL << 4// 连接结束switch (eventCode) {case NSStreamEventOpenCompleted:NSLog(@"输入输出流打开完成");break;case NSStreamEventHasBytesAvailable:NSLog(@"有字节可读");[self readData];break;case NSStreamEventHasSpaceAvailable:NSLog(@"可以发送字节");break;case NSStreamEventErrorOccurred:NSLog(@" 连接出现错误");break;case NSStreamEventEndEncountered:NSLog(@"连接结束");// 关闭输入输出流[_inputStream close];[_outputStream close];// 从主运行循环移除[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];break;default:break;}
}
- (IBAction)connectToHost:(id)sender {// 1.建立连接NSString *host = @"127.0.0.1";int port = 12345;// 定义C语言输入输出流CFReadStreamRef readStream;CFWriteStreamRef writeStream;CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);// 把C语言的输入输出流转化成OC对象_inputStream = (__bridge NSInputStream *)(readStream);_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];
}
- (IBAction)loginBtnClick:(id)sender {// 登录// 发送用户名和密码// 在这里做的时候,只发用户名,密码就不用发送// 如果要登录,发送的数据格式为 "iam:zhangsan";// 如果要发送聊天消息,数据格式为 "msg:did you have dinner";//登录的指令NSString *loginStr = @"iam:zhangsan";//把Str转成NSDataNSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];[_outputStream write:data.bytes maxLength:data.length];
}
#pragma mark 读了服务器返回的数据
-(void)readData{//建立一个缓冲区 可以放1024个字节uint8_t buf[1024];// 返回实际装的字节数NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];// 把字节数组转化成字符串NSData *data = [NSData dataWithBytes:buf length:len];// 从服务器接收到的数据NSString *recStr =  [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];[self reloadDataWithText:recStr];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{NSString *text = textField.text;// 聊天信息NSString *msgStr = [NSString stringWithFormat:@"msg:%@",text];//把Str转成NSDataNSData *data = [msgStr dataUsingEncoding:NSUTF8StringEncoding];// 刷新表格[self reloadDataWithText:msgStr];// 发送数据[_outputStream write:data.bytes maxLength:data.length];// 发送完数据,清空textFieldtextField.text = nil;return YES;
}
-(void)reloadDataWithText:(NSString *)text{[self.chatMsgs addObject:text];[self.tableView reloadData];// 数据多,应该往上滚动NSIndexPath *lastPath = [NSIndexPath indexPathForRow:self.chatMsgs.count - 1 inSection:0];[self.tableView scrollToRowAtIndexPath:lastPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
#pragma mark 表格的数据源
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.chatMsgs.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *ID = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];cell.textLabel.text = self.chatMsgs[indexPath.row];return cell;
}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{[self.view endEditing:YES];
}
@end

服务器在github上 ,可以自己下载的玩玩。本人java刚入门,只能到这,可以在这个服务器的基础上扩展下其他功能。

转载于:https://my.oschina.net/sttman/blog/667194

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP配置,php.ini以及覆盖问题

在部署一个cms项目到服务器上的时候&#xff0c;因为cms的模板比较老&#xff0c;服务器上用的php是5.3.3版&#xff08;大于5.3&#xff0c;可以认为是新的&#xff09;&#xff0c;有些页面会显示“deprecated”类别的错误信息。安全起见要抑制页面中的错误信息输出&#xff…

C/C++宏的使用总结

宏替换是C/C系列语言的技术特色&#xff0c;C/C语言提供了强大的宏替换功能&#xff0c;源代码在进入编译器之前&#xff0c;要先经过一个称为“预处理器”的模块&#xff0c;这个模块将宏根据编译参数和实际编码进行展开&#xff0c;展开后的代码才正式进入编译器&#xff0c;…

Macosx 安装 ionic 成功教程

2019独角兽企业重金招聘Python工程师标准>>> 一、首先介绍一下ionic ionic是一个用来开发混合手机应用的&#xff0c;开源的&#xff0c;免费的代码库。可以优化html、css和js的性能&#xff0c;构建高效的应用程序&#xff0c;而且还可以用于构建Sass和AngularJS的…

hp g6服务器安装系统,HPProLiantDL180G6服务器安装图.PDF

HPProLiantDL180G6服务器安装图4 前面板组件 / 25 个 2.5 英寸硬盘型号HP ProLiant DL180 G6 识别服务器组件2 光驱服务器 前面板组件 3 前部 UID LED 指示灯/开关4 系统运行状况 LED 指示灯1 前面板组件/4 个 3.5 英寸硬盘型号 5 网卡 1 活动 LED 指示灯安装图 6 网卡 2 活动 …

九度OJ 1076:N的阶乘 (数字特性、大数运算)

时间限制&#xff1a;3 秒 内存限制&#xff1a;128 兆 特殊判题&#xff1a;否 提交&#xff1a;6384 解决&#xff1a;2238 题目描述&#xff1a;输入一个正整数N&#xff0c;输出N的阶乘。 输入&#xff1a;正整数N(0<N<1000) 输出&#xff1a;输入可能包括多组数据&a…

Visual C++中 #include stdafx.h 头文件的用法

今天在做VC实验时&#xff0c;总是出现莫名其妙的错误。比如说&#xff1a; unexpected end of file whilelooking for precompiled header directive 再比如说这么一大串&#xff1a; mainframe.cpp 有错误\firstdlg.h(21) :error C2065: IDD_DIALOG_FIRST : undeclared ide…

mac显示无法连接adobe服务器,Mac安装Adobe软件,如遇Error提示解决方法

Mac10.15.3 安装Adobe Photoshop 2020的时候一直提示Error错误The installation cannot continue as the installer file may be damaged. Download the installer file again.看到这种问题&#xff0c;一般第一想法就是安装包损坏了&#xff0c;本能的会再下载一遍甚至多遍&am…

android开发中EditText自动获取焦点时隐藏hint的代码

只需让EditText设置以下的OnFocusChangeListener就可以了 private OnFocusChangeListener mOnFocusChangeListener new OnFocusChangeListener() {Overridepublic void onFocusChange(View v, boolean hasFocus){EditText textView (EditText)v;String hint;if (hasFocus) {h…

Grovvy初识

1.Groovy和Java对比 Groovy的松散的语法允许省略分号和修饰符除非另行指定&#xff0c;Grovvy的所有内容都为publicGrovvy允许定义简单脚本&#xff0c;同时无需定义正规的class对象Grovvy在普通的常用java对象上增加了一些独特的方法和快捷方式&#xff0c;使得他们更容易使用…

C和C++混合编程(__cplusplus使用)

第一种理解 比如说你用C开发了一个DLL库&#xff0c;为了能够让C语言也能够调用你的DLL输出(Export)的函数&#xff0c;你需要用extern "C"来强制编译器不要修改你的 函数名。 通常&#xff0c;在C语言的头文件中经常可以看到类似下面这种形式的代码&#xff1a; …

$.ajax 同步一不,ajax 同步不生效

可以用的生效代码注意 boolean 的位置var baseUrl ${pageContext.request.contextPath };function formcheck(){var flag false;var customerNameaa;var countryaa;var citybeijing;$.ajax({type: POST,url:baseUrl "/exports/credit/findBuyersBySerach",data:{&…

iOS工程中创建pch文件

1.新建pch类文件 2.在工程配置中,Build Setting 下搜索"pre"寻找Apple LLVM6.1 - Language下的 Preflx Header 3.点开Preflx Header 把左边pch类拖拽进去 4.把/"工程名"/....前边的内容全部换为$(SRCROOT) (具体替换内容看报错自己灵活运用)转载于:https:/…

批处理中setlocal enabledelayedexpansion的作用详细整理

设置本地为延迟扩展。其实也就是&#xff1a;延迟变量&#xff0c;全称延迟环境变量扩展, 想进阶&#xff0c;变量延迟是必过的一关&#xff01;所以这一部分希望你能认真看。 为了更好的说明问题&#xff0c;我们先引入一个例子。 例1: echo off set a4 set a5&echo…

一个服务器多个网站多个域名,多个域名一个服务器吗

多个域名一个服务器吗 内容精选换一换PAS(Primary Application Server)&#xff1a;主应用服务器。AAS(Additional Application Server)&#xff1a;扩展应用服务器。ASCS(ABAP Central Services)&#xff1a;SAP应用核心服务&#xff0c;是SAP应用的一个核心控件&#xff0c;包…

iframe 子父窗口互掉 js

一、父窗口调用iframe子窗口方法 1、HTML语法&#xff1a;<iframe name"myFrame" src"child.html"></iframe> 2、父窗口调用子窗口&#xff1a;myFrame.window.functionName(); 3、子窗品调用父窗口&#xff1a;parent.functionName(); 简单地…

yii2 ajax分页,Yii框架分页技术实例分析

本文实例讲述了Yii框架分页技术。分享给大家供大家参考&#xff0c;具体如下&#xff1a;直接上代码&#xff1a;1.首先写控制器层先引用pagination类use yii\data\Pagination;写自己的方法:function actionFenye(){$data Field::find(); //Field为model层,在控制器刚开始use了…

Spring源码解析——如何阅读源码

阅读目录 下面看一下如何使用jar包以及源码的source包  下面给出一个简单的spring样例  如何阅读源码最近没什么实质性的工作&#xff0c;正好有点时间&#xff0c;就想学学别人的代码。也看过一点源码&#xff0c;算是有了点阅读的经验&#xff0c;于是下定决心看下spring…

c++多线程编程

一直对多线程编程这一块很陌生&#xff0c;决定花一点时间整理一下。 os:ubuntu 10.04 c 1.最基础&#xff0c;进程同时创建5个线程&#xff0c;各自调用同一个函数 [html] view plaincopy #include <iostream> #include <pthread.h> //多线程相关操作头文件&am…

ajax当页post请求,tag落地页--通过ajax-post请求数据

查询所有tag及其对应跳转链接$tags get_tags(array(get>all));$output . ;if($tags) {foreach ($tags as $tag):$output . . $tag->name .;endforeach;} else {_e(No tags created., text-domain);}$output . ;echo $output;交互tag查询image场景如下&#xff0c;通过页…

GIT的PUSH指令

### GIT的PUSH指令 $ git push <远程主机名> <本地分支名>:<远程分支名> * git push命令用于将本地分支的更新&#xff0c;推送到远程主机。 * 如果省略远程分支名&#xff0c;则表示将本地分支推送到与之对应的远程分支&#xff08;通常两者同名&#xff…