2 xingfudeyutian xingfudeyutian 于 2014.11.25 16:25 提问

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

ios客户端和服务器通信时
都有那些方法?那种比较好用或最常用的?

3个回答

caozhy
caozhy   Ds   Rxr 2014.11.25 17:43

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(&addr4,0,sizeof(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),buffer,sizeof(buffer),0)) {

}

[pool release];

}

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

-(void) sendstream

{

NSString * stringtosend = @"hello everyone";

const char *data = [stringtosend UTF8String];

send(CFSocketGetNative(cfsock),data,strlen(data)+1,0);

}

服务器端的程序:

CFSocketRef socketserver;

int setupSocket()

{

socketserver =CFSocketCreate(kCFAllocatorDefault,PF_INET,SOCK_STREAM,IPPROTO_TCP,kCFSocketAcceptCallBack,myaccept,NULL);

int optval =1;

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

struct sockaddr_in addr4;

memset(&addr4,0,sizeof(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={

0,NULL,NULL,NULL

};

// 注册两种事件!

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 stream,CFStreamEventType 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)kCFBooleanFalse,kCFStreamSSLValidatesCertificateChain,kCFBooleanFalse,kCFStreamSSLIsServer,nil];

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

ForestDB
ForestDB   Rxr 2014.11.26 22:14

来一个笼统的回答,通过网络。

ggbb190
ggbb190   2014.12.08 18:15

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
android与服务器各种通信方式的区别
大 学学习网络基础的时候老师讲过,网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解,我知道IP协议对应于网 络层,TCP协议对应于传输层,而HTTP协议对应于应用层,三者从本质上来说没有可比性,socket则是对TCP/IP协议的封装和应用(程序员层面 上)。也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要
移动客户端与服务器通信方式一
*今天测试了一下Java 给iOS客户端推送消息,包括静默推送 ,还有别名推送,其实是和token绑定在一块的, 玩转推送后有很多问题都迎刃而解了,但是一波未平一波又起啊!又会有新的问题出现,先看看代码吧* iOS// 说明 这是在用户同意推送的前提上进行的,如果用户没有同意,那下面的都是扯淡了, - (BOOL)application:(UIApplication *)application
如何客户端与服务器通信的安全?
最近通过 抓包 抓取了某 app 数据   api xxxxxxxxx,  看到 不同api  共同的参数   token 、 app_id 、style 、 promotion_id  、timestamp  这些参数  就是固定的请求参数  ,一开始 没有想太多,抓取几个接口,当天自己写了demo  能获取到数据,发现第二天 在打开demo  提示 ‘invalid appkey.’ 也就
iOS_Socket_即时通讯Demo
iOS客户端和服务器,基于AsyncSocket, 相互通信、即时通讯
iOS_Socket_Demo
基于AsyncSocket, iOS客户端和服务器,相互通信
Android客户端与服务器的通信
现在我想开发一个App,主要功能如下:首先从手机上传一张照片到服务器,服务器将图片进行操作比如旋转,将得到的结果传回带客户端。现在的问题主要有:用什么方法将图片上传到服务器;服务器应该怎么配置,用什么方法配置;服务器处理后的结果怎么传回客户端。请大家给点建议,谢谢!
客户端和服务器端的通信(Socket编程)
Socket编程此篇博文的来源 自己一直以为将网络编程这块的知识掌握的还可以了,今天突然有涉及客户端和服务器端的通信的这一块知识的应用,发现自己还不是那么的熟悉这一块,鼓捣了半天,因此就想通过此篇博文来记录一下,也希望能够给更对的朋友们一点帮助
服务器与单个客户端多次通信
package net02;import java.io.IOException; import java.io.InputStream;/** * 处理输入流的线程类 * @author Administrator * */public class ReaderThread implements Runnable { private InputStream is; p
Android手机app与服务器端进行通信(一)
Android手机app与服务器端进行通信(一)正文 当前手机app与服务器端通信,通常有两种方式,一种是长连接,利用Socket进行连接,另一种是短连接通过Http进行连接。相较而言,短连接不损耗系统资源,只有当客户端app进行操作时才会与服务器端进行连接,而长连接客户端与服务器端是一直保持连接的,适用于服务器端主动向客户端推送信息服务,一些即时通讯。
一种即时通信数据传输方法、客户端、服务器及系统
一种即时通信数据传输方法、客户端、服务器及系统  摘要 本发明实施例提供一种即时通信数据传输方法、客户端、服务器及系统,其中,方法可以包括:向服务器发送传输控制协议TCP连接建立请求,建立与所述服务器的TCP连接,形成与所述服务器相连的TCP传输通道;确定待发送的基础数据,所述基础数据为经过TCP协议封装后的数据;采用Json格式对所述基础数据进行封包处理,生成与TCP协议对应的J