问一个笼统的问题,ios客户端和服务器通信都有什么方法

问题描述

问一个笼统的问题,ios客户端和服务器通信都有什么方法
ios客户端和服务器通信时
都有那些方法?那种比较好用或最常用的?

解决方案

ios设备的网络通信的方法,有如下两个大类:

1、使用socket的方式进行通信。

2、使用asynsocket类库进行通信。

两种方法当中,我觉得asynsocket更好,因为是别人已经封装好的类库,比较稳定。但是对于直接使用socket的通信方法我倒是觉得很灵活。因为控制都是自己在做的事情。

先列举集中不同的使用方法:

1、直接使用socket的方式。

以 TCP为利,对于TCP来说,是要区分服务端和客户端的。服务端:通常的方法是服务端启动后监听,是否有客户端连接,如果有连接,则建立与客户端的通信。客户端的方法通常是连接服务端,当连接成功之后,就希望发送数据了。

客户端:

CFSocketContext sockContext ;

CFSocketRef cfsock ;

sockContext.info = self;

sockContext.copyDescription = 0;

cfsock = CFSocketCreate(kCFAllocatorDefault

PF_INET

SOCK_STREAM

IPPROTO_TCP

kCFSocketConnectCallBack

MyCallBack

&sockContext

);

// 这个地方是个关键的地方,就是建立一个ip地址,然后使的客户端可以向服务端发起连接。

NSString *strAddress = @""192.168.1.1"";

if (cfsock != nil) {

struct sockaddr_in addr4;

memset(&addr40sizeof(addr4));

addr4.sin_len = sizeof(addr4);

addr4.sin_family = AF_INET;

addr4.sin_port = htons(1230);

addr4.sin_addr.s_addr = inet_addr( [strAddress UTF8String] );

CFDataRef address = CFDataCreate(kCFAllocatorDefault (UInt8*)&addr4 sizeof(addr4));

CFSocketConnectToAddress(cfsock address -1);

}

// 发起连接之后,需要将runloop的过程,也就是消息的过程加入到当前线程当中。这样当有事件发生时,会调用对应的方法。

CFRunLoopRef crun = CFRunLoopGetCurrent();// CFRunLoopGetMain();

CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault cfsock 0);

CFRunLoopAddSource(crun source kCFRunLoopCommonModes);

CFRelease(source);

回调函数:当连接成功之后的处理如下:

static void MyCallBack (

CFSocketRef s

CFSocketCallBackType callbackType

CFDataRef address

const void *data

void *info

)

{

if (data!=NULL) {

NSLog(@""传输失败!"");

}

SocketTestAppDelegate client = (SocketTestAppDelegate)info;

[client performSelectoInBackground:@selector(readstream) withObject:nil];

}

-(void) readstream

{

char buffer[1024];

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

while (recv(CFSocketGetNative(cfsock)buffersizeof(buffer)0)) {

}

[pool release];

}

// 如果希望直接向服务器写内容的话,采用如下的方法。

-(void) sendstream

{

NSString * stringtosend = @""hello everyone"";

const char *data = [stringtosend UTF8String];

send(CFSocketGetNative(cfsock)datastrlen(data)+10);

}

服务器端的程序:

CFSocketRef socketserver;

int setupSocket()

{

socketserver =CFSocketCreate(kCFAllocatorDefaultPF_INETSOCK_STREAMIPPROTO_TCPkCFSocketAcceptCallBackmyacceptNULL);

int optval =1;

setsockopt(CFSocketGetNative(socketserver) SOL_SOCKET SO_REUSEADDR (void*)&optvalsizeof(optval));

struct sockaddr_in addr4;

memset(&addr40sizeof(addr4));

addr4.sin_len = sizeof(addr4);

addr4.sin_family = AF_INET;

addr4.sin_port = htons(10);

addr4.sin_addr.s_addr=htonl(INADDR_ANY);

CFDataRef address = CFDataCreate(kCFAllocatorDefault (UInt8*)&addr4 sizeof(addr4));

CFSocketSetAddress(socketserver address);

CFRunLoopRef cfRunloop = CFRunLoopGetCurrent();

CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault socketserver 0);

CFRunLoopAddSource(cfRunloop source kCFRunLoopCommonModes);

CFRelease(source);

}

//服务端的socket建立之后,就需要接受client的连接,因此建立连接的回调函数。

static void myaccept (

CFSocketRef s

CFSocketCallBackType callbackType

CFDataRef address

const void *data

void *info

)

{

if (callbackType == kCFSocketAcceptCallBack) {

// 如果对端连接成功的话,是可以获取对端的名称和socket的。

CFSocketNativeHandle nativesockethandle = (CFSocketNativeHandle)data;

uint8_t name[100];

socklen_t namelen = 100;

getpeername(nativesockethandle (struct sockaddr *)name &namelen);

//除此以外,更重要的是获取输入流 和 输出流,

CFReadStreamRef iStream;

CFWriteStreamRef oStream;

// 创建一个可读写的socket连接

CFStreamCreatePairWithSocket(kCFAllocatorDefault nativesockethandle &iStream &oStream);

CFStreamClientContext streamcontext={

0NULLNULLNULL

};

// 注册两种事件!

CFReadStreamSetClient(iStream kCFStreamEventHasBytesAvailable readStream &streamcontext);

CFReadStreamSetClient(iStream kCFStreamEventCanAcceptBytes writeStream &streamcontext);

//加入到循环当中!

CFReadStreamScheduleWithRunLoop(iStream CFRunLoopGetCurrent()kCFRunLoopCommonModes);

CFWriteStreamScheduleWithRunLoop(oStream CFRunLoopGetCurrent()kCFRunLoopCommonModes);

CFReadStreamOpen(iStream);

CFWriteStreamOpen(oStream);

}

}

void readStream(CFReadStreamRef streamCFStreamEventType eventType void *clientCallBackInfo) {

UInt8 buff[255];CFReadStreamRead(stream buff 255);printf(""received: %s"" buff);

}

void writeStream (CFWriteStreamRef stream CFStreamEventType eventType void *clientCallBackInfo) {

// outputStream = stream;

char *str = ""nihao"";
CFWriteStreamWrite(outputStream str strlen(line) + 1);

}

另一种方法是使用NSStream的方式构建客户端,然后发送和接受内容。

-(void)startClient

{

host

= [NSHosthostWithAddress:@""192.168.201.24""];//hostWithName:@""www.apple.com""];

[NSStreamgetStreamsToHost:host

port:4242 inputStream:&inStream outputStream:&outStream];

if((inStream

== nil)
|| (outStream == nil))

{    NSLog(@""Error:

Failed to create streams!"")
;

    [selfrelease];}

}

(void)stream:(NSStream*)aStream
handleEvent:(NSStreamEvent)eventCode

{

switch(eventCode)

{

    caseNSStreamEventHasBytesAvailable:    {        NSMutableData*input

= [[NSMutableDataalloc]
init];

        uint8_t

buffer[1024];

        intlen;        while([inStream

hasBytesAvailable])

        {            len

= [inStream read:buffer maxLength:sizeof(buffer)];

            if(len

0)

            {                [input

appendBytes:buffer length:len];

            }        }        self._resultdata

= input;

        self._resultstring

= [[NSStringalloc]
initWithData:input encoding:NSUTF8StringEncoding];

        [input

release];

        break;    }    caseNSStreamEventEndEncountered:        [selfcloseStream];        break;    caseNSStreamEventHasSpaceAvailable:    caseNSStreamEventErrorOccurred:    {        NSLog(@""Error:%@:%@""[[aStream

streamError] code] [[aStream streamError] localizedDescription]);

    }    caseNSStreamEventOpenCompleted:    caseNSStreamEventNone:    default:        break;}

}

-(void)closeStream{

[inStream

close];

[outStream

close];

[inStream

removeFromRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];

[outStream

removeFromRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];

[inStream

setDelegate:nil];

[outStream

setDelegate:nil];

[inStream

release];

[outStream

release];

inStream

= nil;

outStream

= nil;

}

-(void)openStream{

[inStream

retain];

[outStream

retain];

[inStream

setProperty:NSStreamSocketSecurityLevelSSLv3forKey:NSStreamSocketSecurityLevelKey];

[outStream

setProperty:NSStreamSocketSecurityLevelSSLv3forKey:NSStreamSocketSecurityLevelKey];

NSMutableDictionary*

sslSettings;

sslSettings

= [NSMutableDictionarydictionaryWithObjectsAndKeys:(id)kCFBooleanFalsekCFStreamSSLValidatesCertificateChainkCFBooleanFalsekCFStreamSSLIsServernil];

CFWriteStreamSetProperty((CFWriteStreamRef)outStream

kCFStreamPropertySSLSettings sslSettings);

[inStream

setDelegate:self];

[outStream

setDelegate:self];

[inStream

scheduleInRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];

[outStream

scheduleInRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];

[inStream

open];

[outStream

open];

}

-(int)writeString:
(NSString*)
string

{

NSData*messageAsData

= [string dataUsingEncoding:NSASCIIStringEncoding];

return[outStream

write: (c*****t uint8_t *) [messageAsData bytes] maxLength: [messageAsData length]];

}

-(int)writeBytes:
(char*)
buffer length: (unsigned int)
len

{

return[outStream

write: (c*****t uint8_t *) buffer maxLength: len];

}

@end

转自:http://blog.csdn.net/dongdongdongjl/article/details/7776377

解决方案二:
来一个笼统的回答,通过网络。

解决方案三:
看你时是否需要实时通讯
获取数据提交数据可以直接调用html、webservice
被动接受可以用推送
如果是聊天复杂些,可以看看xmpp

时间: 2024-09-25 04:53:29

问一个笼统的问题,ios客户端和服务器通信都有什么方法的相关文章

ios项目中客户端与服务器通信 认证加密怎么做?

问题描述 ios项目中客户端与服务器通信 认证加密怎么做? ios项目中客户端与服务器通信 认证加密怎么做? 主要是还不理解 解决方案 Apple 的 iAP认证,需要参考协议 + 加密 IC 来实现不懂就要看协议,是比较复杂,且只是 E 文版本的文档 解决方案二: iAP是内购吧,与问题不太相关吧..通信中感觉主要做好这几点吧1.HTTPS2.字符串参数.文件等敏感信息传输过程中保持加密状态,至于加密算法,建议使用非对称的RSA

多线程-android菜鸟 关于客户端与服务器通信 求助

问题描述 android菜鸟 关于客户端与服务器通信 求助 我是个android开发菜鸟 切入正题 listview的图文混排 用json从服务器通过post请求方式获得数据 (BaseClient和handler多线程方式) 然后将数据解析 用baseadapter填到布局界面中 求助 解决方案 Android客户端和服务器通信android客户端与服务器通信问题android服务器和客户端通信1 解决方案二: 然后lz你想求助的是什么呢.这是一个工程还是要思路还是要参考资料

java 客户端 服务器-java客户端和服务器通信

问题描述 java客户端和服务器通信 1C try{ Socket s=new Socket(""127.0.0.1""9997); System.out.println(s); InputStreamReader isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr);//接受客户端的消息 pw =new PrintWriter(s.getOutputStream()tru

我问一个笼统一点的问题,关于ASP.net网站开发环境的!请大家来看看解答一下.

问题描述 突然发现现在有不少.net的网站和实例,在编写方法上来讲,应都不是依靠用vs2003或者vs2005的开发环境中写出的.按说在web规划,设计,切片,布局做完以后应该就是添加动态内容.编写程序..我想问一下,现在主流的,或者大家常用的开发环境都是什么呢?比方说,现在dreamweaver8和dreamweaverCS3,本应是面向布局的软件.但是里面的表单跟数据相关的工具也是比较全面,我的意思并不是说动态功能要如何实现,理论上说就算用记事本也当然可以实现任何技术,但是一般没有人用记事本

服务器-问一个关于putty的问题

问题描述 问一个关于putty的问题 菜鸟问一个小问题,putty远程登录服务器之后如何把服务器上的文件下载到本地,以及如何把本地文件传到服务器上 解决方案 如果你的本机是windows的,可以使用工具:WinSCP 解决方案二: 只要知道本地的IP地址就可以使用scp命令拷贝,如:scp -r 文件夹名 用户名@服务器IP:/目的路径 然后输入用户名密码就可以实现copy 解决方案三: 只要知道本地的IP地址就可以使用scp命令拷贝,如:scp -r 文件夹名 用户名@服务器IP:/目的路径

iOS与Java服务器GZip压缩问题

昨天搞了一天的GZip压缩,试了三种方式(libz库,ZipArchive,ASIHttpRequest),一开始都不成功.理论上三个应该都能用的,但我都不行.等我试到第三种方式的时候才知道,不是我的问题,而是后台的问题(Java端输出方式一会再说).今天就总结一下,写写iOS与Java服务器获取压缩数据的方法吧.一.客户端-服务端数据压缩解压流程(ASIHttpRequest)客户端生成request,设置header允许使用压缩("Accept-Encoding","gz

tcp/ip socket-TCP/IP客户端与服务器之间的通信问题。。急求解决方法!!!!!

问题描述 TCP/IP客户端与服务器之间的通信问题..急求解决方法!!!!! 在做一个项目,问题,客户端和服务器端可以都开两个线程.即客户端打开线程1和线程2,服务器端打开线程1和线程2.在通信过程中服务器线程1与客户端线程1通信,服务器线程2与客户端线程2通信,这样子怎么实现呢???急求 解决方案 你先搞懂socket怎么用,然后网上有很多socket的例子,有的很不错,自己研究一下 解决方案二: socket我已经了解过了,实现了多个客户端同时与服务器之间的通信,现在想做客户端开两个线程一个

根据URL下载图片至客户端、服务器的简单实例_java

1.保存至服务器 根据路径保存至项目所在服务器上. String imgUrl="";//图片地址 try { // 构造URL URL url = new URL(imgUrl); // 打开连接 URLConnection con = url.openConnection(); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int le

游戏大厅从基础开始(3.5)——客户端与服务器的连接

可能要犯大忌讳 本次只有代码 所以补充两句 正在实现策略模式的constructor 所以最 近没有时间整理注释 大家凑合看 随后补说明 Code Namespace Communicate.TCP Class TCPLinkListener Inherits Global.WayneGameSolution.Communicate.LinkListener Public Shared ReadOnly propertyKeys As String() = {"Port", "