`

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

阅读更多

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

 

 

 

2

 

有关客户端应用的UI部分不再介绍了,我们直接看代码部分,Socket客户端可以采用CFStream或NSStream实现,CFStream 实现方式与服务器端基本一样。本例我们采用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,如果flag0发送数据,flag1接收数据。

 

流的状态的变化触发很多事件,并回调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];

}

 

分享到:
评论

相关推荐

    swift-iOS基于NSStream实现的Socket长连接小封装

    在这个特定的项目中,"swift-iOS基于NSStream实现的Socket长连接小封装" 提供了一种利用Swift进行网络通信的方法,特别是通过NSStream实现的Socket长连接。下面我们将深入探讨相关的知识点。 1. **Socket基础**: ...

    iOS 套接字编程--TCP

    在iOS开发中,套接字(Socket)编程是网络通信的基础,它允许应用程序通过网络发送和接收数据。本文将深入探讨iOS平台上的TCP套接字编程,并基于提供的"TCPDemo"示例进行详细讲解。 首先,TCP(Transmission ...

    IOS (iPhone)tcp通讯客户端源码

    本资源提供的"IOS (iPhone) tcp通讯客户端源码"是一个实用的示例,它展示了如何在iPhone平台上实现TCP客户端功能。下面将详细解释相关知识点。 1. TCP 协议: - TCP是一种面向连接的、可靠的传输层协议,它通过三...

    ios网络编程.pdf

    在给定的“iOS网络编程实践--NSStream实现TCP Socket”文档中,讲解了如何使用NSStream来创建一个简单的iPhone客户端,该客户端能够通过TCP Socket与服务器进行通信。以下是对相关知识点的详细说明: 1. **TCP ...

    iOS网络编程SocketDemo

    在iOS开发中,网络编程是不可或缺的一部分,而Socket编程则是实现网络通信的一种基础方式。"iOS网络编程SocketDemo"是一个示例项目,旨在帮助开发者理解并掌握如何在iOS应用中使用Socket进行网络通信。 首先,...

    使用 BSD socket API 实现 TCP 客户端和服务器

    Objective-C 实现 TCP 通信通常涉及到使用底层的 BSD socket API 或者使用更高级别的网络框架,如 NSStream。附件是一个使用 BSD socket API 实现 TCP 客户端和服务器的基本示例。 请注意,这些代码是基础的 BSD ...

    objective-c实现socket的几个Demo

    在iPhone平台上,当你需要为iOS应用添加Socket功能时,可以使用`NSStream`来创建TCP或UDP连接。TCP(传输控制协议)是面向连接的,提供可靠的数据传输;UDP(用户数据报协议)则无连接,适合于速度优先且能容忍数据...

    iOS网络编程之Socket.pdf

    在 iOS 系统下使用 BSD socket 进行编程,可以实现各种网络编程的需求,例如客户端-服务器架构、点对点连接、多播、广播等。同时,使用 BSD socket API 也可以实现跨平台的网络编程,例如在 Mac 系统和 Windows 系统...

    iOS Socket 编程介绍

    iOS Socket编程是iOS应用开发中涉及网络通信的重要技术,它允许设备通过TCP/IP协议栈与其他设备或服务器进行数据传输。本文将深入探讨iOS中的Socket编程,包括C/S三次握手过程、iOS Socket技术的层次结构以及...

    ios socket 编程的几种方式

    在iOS开发中,Socket编程是实现设备间网络通信的基础,它允许应用程序通过网络发送和接收数据。本示例代码库“iOSSnippet-master”提供了使用不同iOS Socket API进行编程的方法。以下是对这些方法的详细说明: 1. *...

    IOS-Socket通信实例代码

    在iOS开发中,Socket通信是一种基础且重要的网络编程技术,它允许设备间的双向通信,常用于实现客户端与服务器之间的实时数据交互。本实例代码“IOS-Socket通信实例代码”提供了在iOS平台上使用Socket进行通信的具体...

    OSX服务端+iphone客户端 网络通信小程序

    在本文中,我们将深入探讨如何在OSX服务端与iPhone客户端之间实现网络通信,主要关注CFNETWORK和NSStream这两个关键的iOS及Mac OS X网络编程框架。这些技术使得应用程序能够处理HTTP、FTP、TCP/IP和其他网络协议,...

    iOS Socket 客户端

    在iOS开发中,Socket编程是实现设备间网络通信的重要手段,尤其在需要低级网络控制时,如构建TCP或UDP通信、实现服务器与客户端的数据交换等。本项目"iOS Socket客户端"提供了一个简单的示例,它可以在Xcode 5及iOS ...

    socket通信

    Socket通信是计算机网络编程中的一个重要概念,主要用于实现进程间的通信,尤其在分布式系统和即时通讯(IM)领域中广泛应用。本文将深入探讨如何利用Objective-C的NSStream框架来构建基于Socket的通信,以及面向...

    ios手机socket服务端源码

    在iOS开发中,Socket编程是一种基础且重要的网络通信技术,它允许设备间的双向通信。"ios手机socket服务端源码" 提供了一种在iOS设备上实现Socket服务器的方法,这通常用于设备间的数据交换或者远程控制等场景。下面...

    iOS 客户端 和 服务端编程

    在iOS应用中,这两者常用于实现socket通信,提供低级别的网络连接,适用于需要实时、高效传输数据的场景。 **NSStream** NSStream是面向Objective-C程序员的API,它提供了面向对象的接口来处理输入流(InputStream...

    iOS iPhone 网络编程源代码网络通讯

    在iOS开发中,网络编程是不可或缺的一部分,尤其是在iPhone应用开发中。这个主题主要涉及如何使用Objective-C或Swift语言实现网络通信功能,使应用程序能够通过互联网发送和接收数据。本资源包"SimpleNetworkStreams...

    ios socket demo

    Socket编程在iOS开发中是用于实现设备间网络通信的重要技术,尤其在需要低级网络控制时,如构建服务器客户端架构、实现即时通讯等场景。在这个“ios socket demo”中,我们将探讨如何在iOS应用中使用Socket进行通信...

Global site tag (gtag.js) - Google Analytics