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.pswp.cn/news/458741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458741.shtml
英文地址,請注明出處:http://en.pswp.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…