亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS App通信之local socket示例

2020-07-26 03:14:20
字體:
來源:轉載
供稿:網友

之前看到一篇文章介紹到App之間的五種通信方式,它分別有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket進行本地通信。前面4種都有用到過,也相對比較簡單,幾行代碼的事。對于最后一種之前一直沒用到過(原諒我還是個小白),所以今天試著寫了下,這兒記錄在這里和大家分享。

好了,廢話不多說,開始:

首先,說下它的原理,其實很簡單,一個App在本地的端口進行TCP的bind和listen,另外一個App在本地同一個端口進行connect,這樣就建立了一個正常的TCP連接,可以想傳什么數據就傳什么數據。下面開始先創建服務端:

1,首先用socket()函數創建一個套接字

/* * socket返回一個int值,-1為創建失敗 * 第一個參數指明了協議族/域 ,通常有AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL * 第二個參數指定一個套接口類型:SOCK_STREAM,SOCK_DGRAM、SOCK_SEQPACKET等 * 第三個參數指定相應的傳輸協議,諸如TCP/UDP等,一般設置為0來使用這個默認的值 */int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){ close(sock); NSLog(@"socket error : %d",sock);<br> return;}

 2,綁定本機地址和端口號

// 地址結構體數據,記錄ip和端口號struct sockaddr_in sockAddr;// 聲明使用的協議sockAddr.sin_family = AF_INET;// 獲取本機的ip,轉換成char類型的const char *ip = [[self getIPAddress] cStringUsingEncoding:NSASCIIStringEncoding];// 將ip賦值給結構體,inet_addr()函數是將一個點分十進制的IP轉換成一個長整數型數sockAddr.sin_addr.s_addr = inet_addr(ip);// 設置端口號,htons()是將整型變量從主機字節順序轉變成網絡字節順序sockAddr.sin_port = htons(12345);/* * bind函數用于將套接字關聯一個地址,返回一個int值,-1為失敗 * 第一個參數指定套接字,就是前面socket函數調用返回額套接字 * 第二個參數為指定的地址 * 第三個參數為地址數據的大小 */int bd = bind(sock,(struct sockaddr *) &sockAddr, sizeof(sockAddr));if(bd == -1){ close(sock); NSLog(@"bind error : %d",bd); return;}

 3,監聽綁定的地址

/* * listen函數使用主動連接套接接口變為被連接接口,使得可以接受其他進程的請求,返回一個int值,-1為失敗 * 第一個參數是之前socket函數返回的套接字 * 第二個參數可以理解為連接的最大限制 */int ls = listen(sock,20);if(ls == -1){ close(sock); NSLog(@"listen error : %d",ls); return;}

 4,下面就是等待客戶端的連接,使用accept()(由于accept函數會阻塞線程,在等待連接的過程中會一直卡著,所以建議將其放在子線程里面)

// 1,開啟一個子線程NSTread *recvThread = [[NSThread alloc] initwithTarget:self selector:@selector(recvData) object: nil];[recvThread start]; - (void)recvData{ // 2,等待客戶端連接// 聲明一個地址結構體,用于后面接收客戶端返回的地址  struct sockaddr_in recvAddr;// 地址大小 socklen_t recv_size = sizeof(struct sockaddr_in);/* * accept()函數在連接成功后會返回一個新的套接字(self.newSock),用于之后和這個客戶端之前收發數據 * 第一個參數為之前監聽的套接字,之前是局部變量,現在需要改為全局的 * 第二個參數是一個結果參數,它用來接收一個返回值,這個返回值指定客戶端的地址 * 第三個參數也是一個結果參數,它用來接收recvAddr結構體的代銷,指明其所占的字節數 */self.newSock = accept(self.sock,(struct sockaddr *) &recvAddr, &recv_size);// 3,來到這里就代表已經連接到一個新的客戶端,下面就可以進行收發數據了,主要用到了send()和recv()函數 ssize_t bytesRecv = -1; // 返回數據字節大小 char recvData[128] = ""; // 返回數據緩存區// 如果一端斷開連接,recv就會馬上返回,bytesrecv等于0,然后while循環就會一直執行,所以判斷等于0是跳出去 while(1){ bytesRecv = recv(self.newSocket,recvData,128,0); // recvData為收到的數據 if(bytesRecv == 0){ break;  } }}

 5,發送數據

- (void)sendMessage{   char sendData[32] = "hello client"; ssize_t size_t = send(self.newSocket, sendData, strlen(sendData), 0); }

 客戶端那邊就主要分為:創建套接字,根據ip和端口號獲取服務端的主機地址,然后再連接,連接成功過后就能夠向服務端收發數據了,下面我們看代碼。

1,和服務端一樣用socket函數創建套接字

int sock = socket(AF_INET, SOCK_STREAM,0);if(sock == -1){  NSLog(@"socket error : %d",sock); return;}

 2,獲取主機的地址

NSString *host = [self getIPAddress]; // 獲取本機ip地址// 返回對應于給定主機名的包含主機名字和地址信息的hostent結構指針struct hostent *remoteHostEnt = gethostbyname([host UTF8String]);if(remoteHostEnt == NULL){  close(sock); NSLog(@"無法解析服務器主機名"); return;}<br>// 配置套接字將要連接主機的ip地址和端口號,用于connect()函數struct in_addr *remoteInAddr = (struct in_addr *)remoteHost->h_addr_list[0];struct sockaddr_in socktPram;socketPram.sin_family = AF_INT;socketPram.sin_addr = *remoteInAddr;socketPram.sin_port = htons([port intValue]);

 3,使用connect()函數連接主機

/* * connect函數通常用于客戶端簡歷tcp連接,連接指定地址的主機,函數返回一個int值,-1為失敗 * 第一個參數為socket函數創建的套接字,代表這個套接字要連接指定主機 * 第二個參數為套接字sock想要連接的主機地址和端口號 * 第三個參數為主機地址大小 */int con = connect(sock, (struct sockaddr *) &socketPram, sizeof(socketPram));if(con == -1){ close(sock); NSLog(@"連接失敗"); return;}NSLog("連接成功"); // 來到這代表連接成功;

4,連接成功之后就可以收發數據了

- (IBAction)senddata:(id)sender { // 發送數據 char sendData[32] = "hello service"; ssize_t size_t = send(self.sock, sendData, strlen(sendData), 0); NSLog(@"%zd",size_t);} - (void)recvData{ // 接受數據,放在子線程 ssize_t bytesRecv = -1; char recvData[32] = ""; while (1) {    bytesRecv = recv(self.sock, recvData, 32, 0);  NSLog(@"%zd %s",bytesRecv,recvData);  if (bytesRecv == 0) {   break;  } }}

 好了,利用socket在本地進行兩個App的通訊就這樣就行了。第一次寫博文,一是記錄下自己的心得,二是和大家一起分享,文中有不對的地方希望大家可以指出。最后附上Demo的地址,兩個項目,有興趣的大家可以下下來試下。

https://pan.baidu.com/s/1nvcvC8p

以上就是對iOS App之間的通信 -local socket 的資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区久久久| 欧美成人精品在线视频| 精品欧美aⅴ在线网站| 久久精品国产69国产精品亚洲| 亚洲精品欧美日韩| 51色欧美片视频在线观看| 中文字幕精品在线| 久热精品视频在线免费观看| 97免费视频在线播放| 欧美电影在线观看完整版| www高清在线视频日韩欧美| 久久这里只有精品视频首页| 欧美亚洲国产另类| 亚洲韩国欧洲国产日产av| 欧美日韩在线免费| 一区二区三区高清国产| 国产成人高清激情视频在线观看| 国产ts人妖一区二区三区| 中文字幕一区二区三区电影| 亚洲国产97在线精品一区| 日韩欧美综合在线视频| 亚洲电影免费观看高清完整版在线观看| 日韩电视剧在线观看免费网站| 国产精品91久久久| 欧美福利视频在线| 日韩精品免费一线在线观看| 亚洲精品丝袜日韩| 日韩av成人在线观看| 国产中文日韩欧美| 国产日韩在线看片| 国产欧美精品在线| 色综合久久天天综线观看| 国内精品久久久久久久久| 国产丝袜一区二区三区| 97视频在线观看成人| 全色精品综合影院| 亚洲欧洲成视频免费观看| 亚洲视频777| 国产大片精品免费永久看nba| 亚洲欧美另类国产| 国产在线一区二区三区| 自拍偷拍亚洲精品| 欧美精品18videos性欧美| 日韩激情视频在线播放| 中文字幕精品av| 精品视频在线播放| 亚洲国产精品大全| 国产精品久久久久久久7电影| 国产精品劲爆视频| 97视频网站入口| 亚洲第一福利在线观看| 亚洲成人激情图| 久久av中文字幕| 亚洲一区二区久久久久久| 国产成人精品免费久久久久| 91成人天堂久久成人| 亚洲图片欧洲图片av| 成人午夜高潮视频| 午夜精品久久久久久久99热| 亚洲**2019国产| 欧美孕妇孕交黑巨大网站| 欧美高清理论片| 成人精品一区二区三区电影黑人| 91系列在线播放| 亚洲成色www8888| 成人欧美在线视频| 日韩中文字幕网址| 韩国欧美亚洲国产| 国产精品午夜一区二区欲梦| 亚洲三级黄色在线观看| 精品无码久久久久久国产| 亚洲成人精品久久久| 日韩综合视频在线观看| 国产日韩欧美视频| 日韩a**站在线观看| 亚洲精品女av网站| 在线成人中文字幕| 亚洲精品福利在线观看| 久久久最新网址| 欧美wwwwww| 亚洲欧美一区二区三区在线| 色播久久人人爽人人爽人人片视av| 亚洲欧美日韩一区在线| 日产精品久久久一区二区福利| 国产精品99免视看9| 欧美视频在线观看 亚洲欧| 亚洲第一天堂av| 成人网在线免费观看| 亚洲人成77777在线观看网| 日本19禁啪啪免费观看www| 91精品国产91久久| 最近2019年好看中文字幕视频| 国产日韩欧美影视| 亚洲精品一区二区久| 国产精品久久久999| 国产精品久久中文| 日韩av手机在线观看| 亚洲第一区第二区| 亚洲欧美日韩图片| 成人美女免费网站视频| 亚洲欧美三级在线| 国产精品无av码在线观看| 一区二区三区天堂av| 一本一本久久a久久精品牛牛影视| 亚洲欧美中文字幕在线一区| 91精品国产自产91精品| 亚洲xxx自由成熟| 欧美一区二区三区图| 深夜福利亚洲导航| 国产精品久久久久久久美男| 欧美老女人bb| 精品亚洲va在线va天堂资源站| 日韩欧美aⅴ综合网站发布| 色哟哟网站入口亚洲精品| 亚洲欧美日韩天堂一区二区| 91久久精品视频| 精品中文字幕在线2019| 日韩精品免费看| 欧美视频在线视频| 亚洲精品ady| 粉嫩老牛aⅴ一区二区三区| 91欧美日韩一区| 国产99久久精品一区二区永久免费| 国产精品成人av性教育| 欧美国产激情18| 最新日韩中文字幕| 久久精品视频一| 91老司机在线| xxx成人少妇69| 国产精品视频一| 91在线视频精品| 日韩欧美在线字幕| 97在线免费观看视频| 欧美亚洲国产日韩2020| 91av在线播放视频| 亚洲欧洲在线免费| 一本大道香蕉久在线播放29| 亚洲欧洲激情在线| 亚洲精品在线视频| 欧美在线视频一区二区| 成人黄色免费片| 日韩av在线精品| 久久久噜噜噜久久中文字免| 亚洲аv电影天堂网| 久久人人爽亚洲精品天堂| 亚洲视频视频在线| 日韩经典中文字幕在线观看| 国产乱肥老妇国产一区二| 精品中文字幕久久久久久| 98精品国产自产在线观看| 乱亲女秽乱长久久久| 欧美极品欧美精品欧美视频| 国产成人精品a视频一区www| 丝袜一区二区三区| 一区二区三区无码高清视频| 日韩欧美国产视频| 日韩一区二区精品视频| 中国日韩欧美久久久久久久久| 亚洲的天堂在线中文字幕| 国产91精品久久久久| 狠狠躁夜夜躁人人躁婷婷91| 日产日韩在线亚洲欧美| 欧美日韩在线第一页| 伦伦影院午夜日韩欧美限制|