首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

客户端我们用应iPhone用应程序,画面比较简单。点击发送钮按,给服务器发送一些字符串去过。点击接收钮按就会从服务器读取一些字符串,并且示显在画面上。

有关客户端用应的UI部份不再绍介了,我们直接看代码部份,Socket客户端可以用采CFStream或NSStream实现。为了给读者绍介更多的知识,本例我们用采NSStream实现。NSStream实现用采Objective-C语言,一些面向对象的类。

上面我们看看客户端视图控制器ViewController.h

#import <CoreFoundation/CoreFoundation.h>#include <sys/socket.h>#include <netinet/in.h>#define PORT 9000@interface ViewController : UIViewController<NSStreamDelegate>{int flag ; //操纵志标 0为发送 1为接收}@property (nonatomic, retain) NSInputStream *inputStream;@property (nonatomic, retain) NSOutputStream *outputStream;@property (weak, nonatomic) IBOutlet UILabel *message;- (IBAction)sendData:(id)sender;- (IBAction)receiveData:(id)sender;@end

定义属性inputStream和outputStream,它们输入流NSInputStream和出输流NSOutputStream类。它们与服务器CFStream实现中的输入流CFReadStreamRef和出输流CFWriteStreamRef对应的。

视图控制器ViewController.m的初始化网络法方initNetworkCommunication代码:

- (void)initNetworkCommunication{CFReadStreamRef readStream;CFWriteStreamRef writeStream;CFStreamCreatePairWithSocketToHost(NULL,(CFStringRef)@”192.168.1.103″, PORT, &readStream, &writeStream);   ①_inputStream = (__bridge_transfer NSInputStream *)readStream; ②_outputStream = (__bridge_transfer NSOutputStream*)writeStream;  ③[_inputStream setDelegate:self];  ④[_outputStream setDelegate:self];  ⑤[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode]; ⑥[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];  ⑦[_inputStream open];  ⑧[_outputStream open];  ⑨}点击发送和接收钮按发触的法方如下:/* 点击发送钮按  */- (IBAction)sendData:(id)sender {flag = 0;[self initNetworkCommunication];}/* 点击接收钮按  */- (IBAction)receiveData:(id)sender {flag = 1;[self initNetworkCommunication];}

它们都调用initNetworkCommunication法方,并置设操纵识标flag,如果flag为0发送数据,flag为1接收数据。

流的状态的变更发触很多事件,并调回NSStreamDelegate协议中定义的法方stream:handleEvent:,其代码如下:

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {NSString *event;switch (streamEvent) {case NSStreamEventNone:event = @”NSStreamEventNone”;break;case NSStreamEventOpenCompleted:event = @”NSStreamEventOpenCompleted”;break;case NSStreamEventHasBytesAvailable:event = @”NSStreamEventHasBytesAvailable”;if (flag ==1 && theStream == _inputStream) {NSMutableData *input = [[NSMutableData alloc] init];uint8_t buffer[1024];  ①int len;while([_inputStream hasBytesAvailable]) ②{len = [_inputStream read:buffer maxLength:sizeof(buffer)];  ③if (len > 0){[input appendBytes:buffer length:len];}}NSString *resultstring = [[NSString alloc]initWithData:input encoding:NSUTF8StringEncoding];NSLog(@”接收:%@”,resultstring);_message.text = resultstring;}break;case NSStreamEventHasSpaceAvailable:event = @”NSStreamEventHasSpaceAvailable”;if (flag ==0 && theStream == _outputStream) {//出输UInt8 buff[] = ”Hello Server!”; ④[_outputStream write:buff maxLength: strlen((const char*)buff)+1]; ⑤//关闭出输流[_outputStream close];}break;case NSStreamEventErrorOccurred:event = @”NSStreamEventErrorOccurred”;[self close]; ⑥break;case NSStreamEventEndEncountered:event = @”NSStreamEventEndEncountered”;NSLog(@”Error:%d:%@”,[[theStream streamError] code],[[theStream streamError] localizedDescription]);break;default:[self close];  ⑦event = @”Unknown”;break;}NSLog(@”event——%@”,event);}

在读取数据分支(NSStreamEventHasBytesAvailable)中,代码第①为行读取数据预备缓冲区,本例中置设的是1024个字节,这个小大会对流的读取有很多的影响。第②行代码用应hasBytesAvailable法方判断是不是流有数据可以读,如果有可读数据就进行循环读取。第③行代码用应流的read:maxLength:法方读取数据到缓冲区,第1个数参是缓冲区对象buffer,第2个数参是读取的缓冲区的字节长度。

在入写数据分支(NSStreamEventHasSpaceAvailable)中,代码第④行是要入写的数据,第⑤行代码[_outputStream write:buff maxLength: strlen((const char*)buff)+1]是写如数据法方。

第⑥和第⑦行代码[self close]调用close法方关闭,close法方代码如下:

-(void)close{[_outputStream close];[_outputStream removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];[_outputStream setDelegate:nil];[_inputStream close];[_inputStream removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];[_inputStream setDelegate:nil];}

文章结束给大家分享下程序员的一些笑话语录: 问路
有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”
下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。
热气球上的人说:“你一定是在 IT 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。

转载于:https://www.cnblogs.com/jiangu66/archive/2013/04/15/3022903.html

宋体、代码-iOS网络编程实践--NSStream实现TCP Socket iPhone客户端-by小雨相关推荐

  1. iOS网络编程实践--NSStream实现TCP Socket iPhone客户端

    客户端我们使用iPhone应用程序,画面比较简单.点击发送按钮,给服务器发送一些字符串过去.点击接收按钮就会从服务器读取一些字符串,并且显示在画面上. 有关客户端应用的UI部分不再介绍了,我们直接看代 ...

  2. java 网络编程(二) tcp传输实现客户端和服务端进行信息交流

    1.使用Tcp从一台电脑往另一台电脑上发送文本数据 客户端: import java.io.*; import java.net.*; /**** 客户端,* 通过查阅socket对象,发现在该对象建 ...

  3. iOS网络编程实践--蓝牙对等网络通信实例讲解

    基于蓝牙对等网络通信就是使用Game Kit中的GKSession.GKSessionDelegate. GKPeerPickerController和GKPeerPickerControllerDe ...

  4. 创建收发文件的服务器端 客户端,TCP/IP网络编程 Chap.5 基于TCP的服务器端/客户端(2)...

    已知字符串长度情况下完善回声客户端 # gcc echo_client2.c -o eclient2 # ./eclient2 127.0.0.1 9190 Connected Input messa ...

  5. 《iOS网络编程与云端应用最佳实践》微博转发送书了!

    <iOS网络编程与云端应用最佳实践>微博转发送书了! 新浪微博地址:http://weibo.com/2078101705/zy15U4a5D,转发本条微博即有机会获得<iOS网络编 ...

  6. 转发网络《iOS网络编程与云端应用最佳实践》微博转发送书了

    在写这篇文章之前,xxx已经写过了几篇关于改转发网络主题的文章,想要了解的朋友可以去翻一下之前的文章 <iOS网络编程与云端应用最佳实践>微博转发送书了! 新浪微博地址:http://we ...

  7. iOS网络编程-iCloud键值数据存储编程实例

    iCloud键值数据存储设计 iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击"设置iCloud数据"按钮,将控件状态保存到iCloud服务器.右图是设备2 ...

  8. [深入浅出Cocoa]iOS网络编程之NSStream

    2019独角兽企业重金招聘Python工程师标准>>> [深入浅出Cocoa]iOS网络编程之NSStream 目录(?)[+] [深入浅出Cocoa]iOS网络编程之NSStrea ...

  9. iOS网络编程-配置iCloud-图文解说

    配置iCloud 开发iCloud应用一方面需要准备真实的iOS设备,另一方面还需要有iOS开发者账号, 使 用iOS开发者账号登录到iOS开发中心的配置门户网站(iOS Provisioning P ...

  10. iOS网络编程开发-数据加密

    iOS网络编程开发-数据加密 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题. 如:可以利用软件(比如Charles) ...

最新文章

  1. JavaScript与Java函数的比较
  2. You Need This One Skill to Succeed in IT--reference
  3. 在URL里传入数组到HTML 里。
  4. windows和linux下,查看oracle SID的方法
  5. 硬盘显示容量和实际容量不符合_买移动固态硬盘纠结大半天?花2分钟看完这篇,购买时不再被坑...
  6. 十分钟学会用Go编写Web中间件
  7. 一张图看清自然语言处理脉络
  8. 玩转SpringBoot 2.x 之搭建 Actuator 和 SpringBoot Admin监控篇
  9. Javascript对象扩展 - JsPoint类
  10. Bailian2808 校门外的树【基础】
  11. 既然Tengine比Nginx更强大,为什么Tengine没有取代Nginx呢?
  12. Python——类的实例
  13. ContactsProvider的使用
  14. SEM和SEO的区别
  15. win10升级助手_不用QQ也能电脑远程,win10这功能太良心了!真后悔晚发现
  16. Python3 PDF转图片
  17. Pytho : 算法-选择排序
  18. Pandas官方文档!(中文版PDF下载)
  19. repost ACM算法竞赛生涯
  20. 中间件小师妹 de 年度工作总结

热门文章

  1. async spring 默认线程池_springboot中@Async默认线程池导致OOM问题
  2. JSP的自定义标签(一)
  3. 【渝粤教育】国家开放大学2018年秋季 8181-22T (1)老年保健按摩 参考试题
  4. Lecture 4:无模型预测
  5. 用信号量及其PV操作处理实际问题
  6. 移动端小总结(1)---meta、input和单行多行文字溢出省略号
  7. 【web框架】Django
  8. 【转】雅虎邮箱免费开通POP方法 YAHOO!MAIL YMAIL免费开通POP.SMTP和转发功能
  9. SpringBoot2.0之整合Apollo
  10. Python输入和输出