当前位置:首页 » 编程软件 » socket编程ios

socket编程ios

发布时间: 2022-05-15 07:57:07

1. iOS socket编程如何在不同类中收发数据,使用GCDAsyncSocket第三方

你自己本身要定义一个类吧?在这个类里面再定义name、ID、password内容就可以,MSGBUFFER单纯存储要发送的数据

2. ios如何用c/c++建立socket连接

CFNetwork框架 OR Unix Posix Socket API
添加CFNetwork.framework, 在使用socket的文件头
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <unistd.h>

使用
1. socket 连接
即时通讯最大的特点就是实时性,基本感觉不到延时或是掉线,所以必须对socket的连接进行监视与检测,在断线时进行重新连接,如果用户退出登录,要将socket手动关闭,否则对服务器会造成一定的负荷。
一般来说,一个用户(对于ios来说也就是我们的项目中)只能有一个正在连接的socket,所以这个socket变量必须是全局的,这里可以考虑使用单例或是AppDelegate进行数据共享,本文使用单例。如果对一个已经连接的socket对象再次进行连接操作,会抛出异常(不可对已经连接的socket进行连接)程序崩溃,所以在连接socket之前要对socket对象的连接状态进行判断
使用socket进行即时通讯还有一个必须的操作,即对服务器发送心跳包,每隔一段时间对服务器发送长连接指令(指令不唯一,由服务器端指定,包括使用socket发送消息,发送的数据和格式都是由服务器指定),如果没有收到服务器的返回消息,AsyncSocket会得到失去连接的消息,我们可以在失去连接的回调方法里进行重新连接。
先创建一个单例,命名为Singleton
Singleton.h
// Singleton.h
#import "AsyncSocket.h"

#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \
static dispatch_once_t onceToken = 0; \
__strong static id sharedInstance = nil; \
dispatch_once(&onceToken, ^{ \
sharedInstance = block(); \
}); \
return sharedInstance; \

@interface Singleton : NSObject

+ (Singleton *)sharedInstance;

@end

Singleton.m
+(Singleton *) sharedInstance
{

static Singleton *sharedInstace = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{

sharedInstace = [[self alloc] init];
});

return sharedInstace;
}

这样一个单例就创建好了
在.h文件中生命socket变量
@property (nonatomic, strong) AsyncSocket *socket; // socket
@property (nonatomic, ) NSString *socketHost; // socket的Host
@property (nonatomic, assign) UInt16 socketPort; // socket的prot

下面是连接,心跳,失去连接后重连
连接(长连接)
在.h文件中声明方法,并声明代理<AsyncSocketDelegate>
-(void)socketConnectHost;// socket连接

在.m中实现,连接时host与port都是由服务器指定,如果不是自己写的服务器,请与服务器端开发人员交流
// socket连接
-(void)socketConnectHost{

self.socket = [[AsyncSocket alloc] initWithDelegate:self];

NSError *error = nil;

[self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:3 error:&error];

}

心跳
心跳通过计时器来实现
在singleton.h中声明一个定时器
@property (nonatomic, retain) NSTimer *connectTimer; // 计时器

在.m中实现连接成功回调方法,并在此方法中初始化定时器,发送心跳在后文向服务器发送数据时说明
#pragma mark - 连接成功回调
-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"socket连接成功");

// 每隔30s像服务器发送心跳包
self.connectTimer = [NSTimer scheledTimerWithTimeInterval:30 target:self selector:@selector(longConnectToSocket) userInfo:nil repeats:YES];// 在longConnectToSocket方法中进行长连接需要向服务器发送的讯息

[self.connectTimer fire];

}

2. socket 断开连接与重连
断开连接
失去连接有几种情况,服务器断开,用户主动cut,还可能有如QQ其他设备登录被掉线的情况,不管那种情况,我们都能收到socket回调方法返回给我们的讯息,如果是用户退出登录或是程序退出而需要手动cut,我们在cut前对socket的userData赋予一个值来标记为用户退出,这样我们可以在收到断开信息时判断究竟是什么原因导致的掉线
在.h文件中声明一个枚举类型
enum{
SocketOfflineByServer,// 服务器掉线,默认为0
SocketOfflineByUser, // 用户主动cut
};

声明断开连接方法
-(void)cutOffSocket; // 断开socket连接

.m
// 切断socket
-(void)cutOffSocket{

self.socket.userData = SocketOfflineByUser;// 声明是由用户主动切断

[self.connectTimer invalidate];

[self.socket disconnect];
}

重连
实现代理方法
-(void)onSocketDidDisconnect:(AsyncSocket *)sock
{
NSLog(@"sorry the connect is failure %ld",sock.userData);
if (sock.userData == SocketOfflineByServer) {
// 服务器掉线,重连
[self socketConnectHost];
}
else if (sock.userData == SocketOfflineByUser) {
// 如果由用户断开,不进行重连
return;
}

}

3. socket 发送与接收数据
发送数据
我们补充上文心跳连接未完成的方法
// 心跳连接
-(void)longConnectToSocket{

// 根据服务器要求发送固定格式的数据,假设为指令@"longConnect",但是一般不会是这么简单的指令

NSString *longConnect = @"longConnect";

NSData *dataStream = [longConnect dataUsingEncoding:NSUTF8StringEncoding];

[self.socket writeData:dataStream withTimeout:1 tag:1];

}

socket发送数据是以栈的形式存放,所有数据放在一个栈中,存取时会出现粘包的现象,所以很多时候服务器在收发数据时是以先发送内容字节长度,再发送内容的形式,得到数据时也是先得到一个长度,再根据这个长度在栈中读取这个长度的字节流,如果是这种情况,发送数据时只需在发送内容前发送一个长度,发送方法与发送内容一样,假设长度为8
NSData *dataStream = [@8 dataUsingEncoding:NSUTF8StringEncoding];

[self.socket writeData:dataStream withTimeout:1 tag:1];

接收数据
为了能时刻接收到socket的消息,我们在长连接方法中进行读取数据
[self.socket readDataWithTimeout:30 tag:0];

如果得到数据,会调用回调方法
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
// 对得到的data值进行解析与转换即可

[self.socket readDataWithTimeout:30 tag:0];

}

4. 简单使用说明
我们在用户登录后的第一个界面进行socket的初始化连接操作,在得到数据后,将所需要显示的数据放在singleton中,对变量进行监听后做出相应的操作即可,延伸起来比较复杂,没有真实数据也不太方便说明,大家自己进行探索吧,有问题请在下方留言
[Singleton sharedInstance].socketHost = @"192.186.100.21";// host设定
[Singleton sharedInstance].socketPort = 10045;// port设定

// 在连接前先进行手动断开
[Singleton sharedInstance].socket.userData = SocketOfflineByUser;
[[Singleton sharedInstance] cutOffSocket];

// 确保断开后再连,如果对一个正处于连接状态的socket进行连接,会出现崩溃
[Singleton sharedInstance].socket.userData = SocketOfflineByServer;
[[Singleton sharedInstance] socketConnectHost];

3. ios用什么框架做socket开发

一般使用的网络数据传输中一般涉及到7层,分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。对于程序开发人员而言能够用到的就是传输层,会话层,表示层和应用层。
http协议 对应于应用层

tcp协议 对应于传输层
ip协议 对应于网络层
上边是我们每次网络请求中,各个协议在每个层中的应用,下边的层都为上一层提供了传输基础。上边三层共同构成了一次网络请求(当然还有更底下的我们不做研究的层),而Socket则是对TCP/UDP,IP协议(即传输和网络层)的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/UDP,IP协议。
那么这时候我们就一定要了解HTTP请求和Socket之间到底是怎么样的一个关系呢,又该怎么理解呢?其实Http请求就是基于TCP/IP协议的一层的Socket再封装,只是Socket在数据的传输过程中数据是无法识别的内容如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。而Http协议就是现在使用最广泛的应用层协议,这样我们的才保证了我们可以在网络请求中可以自定义收到的JSON/XML格式的数据。而Http请求实际上每次本质上就是先建立一次Socket长链接 然后接受数据包(因为TCP协议的数据传输是数据流可能是多个包的 Http通过请求头会对包进行处理和组合),当数据包全部接收完成之后,通过协议转换成我们想要的格式返回给我们,然后关闭长链接,这样的一个流程完成一次Http请求。这个时候我们就会发现一个问题,只有我们主动的给服务器端发送请求的时候服务端才会给我们响应返回数据。而且每次网络请求又会重新开启TCP协议中的三次握手的过程,每次使用肯定是耗时的(当然现在基于Http2.0的多次网络请求可以减少握手次数)。但是也只是在每次Http之后还是会关闭Socket而且服务器端都不能在我们没有请求的情况下主动给我们发送消息,这个时候我们就可以使用Socket解决这个问题了。
如果我们建立了一个Socket长链接,不断开服务器端就能和我保持通讯了,这也就是我们现在用的及时通讯软件和视频是直播软件实现的原理(当然视频直播还涉及到很多其他的知识,一直觉得那才是iOS开发中最大的难点),现在我们知道了为什么我们有了Http还要了解Socket,那么接下来就开始介绍Socket底层的一些实现原理,我一直觉得iOS开发如果只是知道一些三方框架如何使用,在框架使用的过程中遇到了实际的问题,我们实际上是很难有实质上的思路去解决问题的,所以很多东西我想最好先从原理上去了解。
这时候我们就要做Socket变成就需要引入几个知识点。
1.地址
1.地址在程序中,我们如何保存一个地址呢?在中的sockaddr便是描述socket地址的结构体类型.

/** [XSI] Structure used by kernel to store most addresses.*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
为了方便设置用语网络通信的socket地址,引入了sockaddr_in结构体(对于UNIX Domain Socket则对应sockaddr_un)
/*
* Socket address, internet style.
*/
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;//得是网络字节序
struct in_addr sin_addr;//in_addr存在的原因则是历史原因,其实质是代表一个IP地址的32位整数
char sin_zero[8];//bzero之,纯粹是为了兼容sockaddr
};
在实际编程的时候,经常需要将sockaddr_in强制转换成sockaddr类型。
2.端口
在本地的进程中,每一个进程都可以通过PID来标识,对于网络上的一个计算机中的进程如何标识呢?网络中的计算机可以通过一个IP地址进行标识,一个计算机中的某个进程则可以通过一个无符号整数(端口号)来标识,所以一个网络中的进程可以通过IP地址+端口号的方式进行标识。

3网络字节序
谈网络字节序(Endianness)之前我们先说说什么是字节序。字节序又叫端序,就是指计算机中存放 多字节数据的字节的顺序。典型的就是数据存放在内存中或者网络传输时的字节的顺序。常用的字节序有大端序(big-endian),小端序(litle-endian,另还有不常见的混合序middle-endian)。不同的CPU可能会使用不同的字节序,如X86,PDP-11等处理器为小端序,Motorola 6800,PowerPC 970等使用的是大端序。小端序是指低字节位存放在内存地址的低端,高端序是指高位字节存放在内存的低端。 举个例子来说明什么是大端序和小端序: 比如一个4字节的整数 16进制形式为 0x12345678,最左边是高位。

大端序

低位 > > > > 高位
12 34 56 78
小端序
低位 > > > > 高位
78 56 34 12
TCP/IP 各层协议将字节序使用的是大端序,我们把TCP/IP协议中使用的字节序称之为网络字节序。 编程的时候可以使用定义在sys/_endian.h中的相关的接口进行本地字节序和网络字节序的互转。

#define ntohs(x) __DARWIN_OSSwapInt16(x) // 16位整数 网络字节序转主机字节序
#define htons(x) __DARWIN_OSSwapInt16(x) // 16位整数 主机字节序转网络字节序
#define ntohl(x) __DARWIN_OSSwapInt32(x) //32位整数 网络字节序转主机字节序
#define htonl(x) __DARWIN_OSSwapInt32(x) //32位整数 主机字节序转网络字节序
以上声明中 n代表netwrok, h代表host ,s代表short,l代表long
如果数据是单字节的话,则其没有字节序的说法了。
4.半相关和全相关
半相关(half-association)是指一个三元组 (协议,本地IP地址,本地端口),通过这个三元组就可以唯一标识一个网络中的进程,一般用于listening socket。但是实际进行通信的过程,至少需要两个进程,且它们所使用的协议必须一致,所以一个完成的网络通信至少需要一个五元组表示(协议,本地地址,本地端口,远端地址,远端端口),这样的五元组叫做全相关。

5.网络编程模型
网络存在的本质其实就是网络中个体之间的在某个领域的信息存在不对等性,所以一般情况下总有一些个体为另一些个体提供服务。提供服务器的我们把它叫做服务器,接受服务的叫做客户端。所以在网络编程中,也存在服务器端和客户端之分。

4. ios怎么实现socket的demo

[curvature.rar] - this is abput image processing
[Tutorial_placas.zip] - HOW TO MAKE A CIRCUIT BOARD Using the method TRANSFER TONNER.
[speexDemoTest.zip] - ios自带的录音程序,共大家参考,里面用到了音频流等技术,可直接使用

[sevAndcli.zip] - ios socket编程实现,包含客户端和服务端,可视化界面
[IPhone-http--socket.rar] - 一份IPHONE的网络编程总结,是初学者学习IPHONE网络编程的好材料。
[Account_Bind_ios_Demo.zip] - 帐号绑定ios演示源代码,希望对大家有用
[socketwrapper.rar] - socket通信,Iphone开发,源代码
[Sendsocket.rar] - Send socket in Android and ios mobile devices
[iphone_socket.zip] - ios上进行socket通信的开源类库,非常有用,简化了socket通信的代码。
[Connect_ios_SDK__V1.2_.zip] - ios qq联合登录sdk,腾讯提供,绝对能使用

5. socket ios 即时通讯代码怎么实现

socket ios 即时通讯代码怎么实现
1、建立连接
- (int)connectServer:(NSString *)hostIP port:(int)hostPort
2、连接成功后,会回调的函数
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
3、发送数据
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
4、接受数据
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
5、断开连接
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
- (void)onSocketDidDisconnect:(AsyncSocket *)sock

6. iOS 可以使用socket进行远程消息推送吗

ios可以使用socket,但是要想做到远程推送可能还是需要apns机制,因为应用退到后台的时候只有apns能处理苹果服务器推送来的消息。iOS使用Socket的常用方式有如下: (1)BSD Socket:是UNIX系统中通用的网络接口,基于c语言,比较底层
(2)CF Socket:苹果官方提供,来自于CoreFoundation框架
(3)AsyncSocket:对BSD Socket的封装,OC语言
(4)ysocket:对BSD Socket的封装,Swift语言
SOCKET原理:套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。是网络通信过程中端点的抽象表示,包含进行。
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。建立连接时所需的寻址信息为IP地址和端口号。
进行远程消息推送可以了解一下极光,极光就挺不错的。JPush iOS 推送相比直接向 APNs 推送减少开发及维护成本:应用开发者不需要去开发维护自己的推送服务器与 APNs 对接。集成了 JPush iOS SDK 后不必自己维护更新 device token。
通过 JPush 的 Web Portal 直接推送,也可以调用 JPush 的 HTTP 协议 API 来完成,开发工作量大大减少。

7. 怎样用socket实现通信现在我的服务端(server)是C#写的,客户端是想用ios系统上的objective-c实现。

1,用c语言的bsd socket

2,用NSStream的socket编程
3,用CFSocket,CFSocektConnectToAddress(...)
4,最推荐使用的, AsyncSocket,对cfsocket进行了封装,相当好用,代码在github上面就有,找到以后去贴,怎么贴问度娘

8. ios socket编程 为什么客户端断开连接了 服务器端

如果我没猜错的话,问题出在你的C#服务端! 看一下你代码中的这条语句 [selfoutSocket readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0]; 参数[AsyncSocket CRLFData]表示读取至"
" 查查你的C#服务端在返回数据时结尾有没有追ios socket编程 为什么客户端断开连接了 服务器端

9. iPhone socket 编程,该怎么处理

连接代码如下:
- (void) doConnect {
CFSocketContext CTX = {0, self, NULL, NULL, NULL};

//Create the socket of TCP
_socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack, TCPServerConnectCallBack, &CTX);

//Create Error
if (NULL == _socket) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Create socket error" delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil];
[alert show];
[alert release];
}

struct sockaddr_in Server_addr;

memset(&Server_addr, 0, sizeof(Server_addr));

Server_addr.sin_len = sizeof(Server_addr);
Server_addr.sin_family = AF_INET;
Server_addr.sin_addr.s_addr = htonl(0xc0a800c8L); //Only 192.168.2.202 allowed
Server_addr.sin_port = htons(70); //Only Port 70 allowed
//Server_addr.sin_addr.s_addr = inet_addr([connController.textField.text UTF8String]);

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

//Connect the the server's socket
CFSocketConnectToAddress(_socket, address, -1);

CFRunLoopRef cfrl = CFRunLoopGetCurrent();
CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0);
CFRunLoopAddSource(cfrl, source, kCFRunLoopCommonModes);
CFRelease(source);

CFRunLoopRun();

while (1) {
struct timeval tv;
tv.tv_usec = 0;
tv.tv_sec = 1;
select(-1, NULL, NULL, NULL, &tv);
}
}

10. iOS 中设备之间 socket 传文件应该怎么实现

socket是比较底层的通讯方式,只是建立了一个连接通道,具体上面传输什么样的数据,按照什么格式传输,需要你自己定义。换句话说,你需要自己定义一个文件传输协议。例如,要定义数据包的大小,要定义每个数据包的格式,定义纠错机制,网络中断后如何恢复等等。大文件要拆分成数据包来传输,接收方要把收到的数据包再组装起来。文件名这些信息也做为原始数据的一部分通过数据包传过去,只不过跟文件内容的数据包类型不一样而已。
但是,实现这样一个传输协议是比较麻烦和容易出错的,象传文件这种逻辑比较简单的操作一般没必要在socket层直接操作。iOS提供了CFStream接口,适合文件这种数据流的传输。iOS本身的FTP和HTTP协议栈的实现也是使用CFStream API,而不是直接操作socket的。

热点内容
android立方体 发布:2024-05-02 15:00:06 浏览:59
手机存储的音乐删除了怎么办 发布:2024-05-02 14:55:00 浏览:377
方舟如何运行服务器 发布:2024-05-02 14:47:45 浏览:770
如何创作抖音模板脚本 发布:2024-05-02 14:42:36 浏览:854
ftp被动模式下载 发布:2024-05-02 14:33:25 浏览:313
教堂电影院ftp 发布:2024-05-02 14:32:35 浏览:481
程序编译机 发布:2024-05-02 14:32:29 浏览:796
cf服务器云南一区云空间 发布:2024-05-02 14:18:24 浏览:752
如何破解excel2007密码 发布:2024-05-02 14:18:23 浏览:993
ios数据上传服务器 发布:2024-05-02 13:39:27 浏览:351