當前位置:首頁 » 編程軟體 » 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的。

熱點內容
小翼管家如何查看密碼 發布:2024-04-19 09:57:31 瀏覽:156
怎麼緩存小品 發布:2024-04-19 09:49:02 瀏覽:410
在系統編程 發布:2024-04-19 08:54:55 瀏覽:235
visualstudio反編譯 發布:2024-04-19 08:44:46 瀏覽:320
ise怎麼配置晶元 發布:2024-04-19 08:27:31 瀏覽:997
免費搭建在線查詢伺服器 發布:2024-04-19 08:17:28 瀏覽:46
vs資料庫實例 發布:2024-04-19 08:14:54 瀏覽:295
vfp9反編譯 發布:2024-04-19 08:11:31 瀏覽:381
火車軟卧無線密碼是多少 發布:2024-04-19 07:38:59 瀏覽:423
vb系統文件夾 發布:2024-04-19 07:29:58 瀏覽:740