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

首頁 > 系統 > iOS > 正文

iOS App之間的通信 local socket

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

之前看到一篇文章介紹到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;}/* * 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的地址,兩個項目,有興趣的大家可以下下來試下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av毛片网| 国产精品美女主播在线观看纯欲| 一区三区二区视频| 国产美女被下药99| 国产欧美在线看| 91精品国产91| 韩国国内大量揄拍精品视频| 欧美成人午夜视频| 亚洲一区二区免费在线| 成人性生交大片免费看视频直播| 欧美极品少妇xxxxⅹ免费视频| 精品国产999| 国产91ⅴ在线精品免费观看| 国产精品久久久久7777婷婷| 伊人久久久久久久久久| 成人妇女淫片aaaa视频| 中文精品99久久国产香蕉| 亚洲日本aⅴ片在线观看香蕉| 国产精品久久一| 91久久久国产精品| 91精品在线播放| 国产精品都在这里| 国产乱人伦真实精品视频| 亚洲第一免费播放区| 欧美巨大黑人极品精男| 亚洲一区制服诱惑| 中文国产成人精品| 国产亚洲美女久久| 日韩在线免费av| 欧美精品性视频| 热re99久久精品国产66热| 国产成人a亚洲精品| 浅井舞香一区二区| 日本欧美国产在线| 情事1991在线| 成人在线国产精品| 欧美激情日韩图片| 岛国精品视频在线播放| 亚洲精品一二区| 91性高湖久久久久久久久_久久99| 日韩国产欧美精品在线| 亚洲精品日韩激情在线电影| 国产日韩欧美夫妻视频在线观看| 国产午夜精品理论片a级探花| 日韩极品精品视频免费观看| 国产福利成人在线| 精品美女永久免费视频| 久久久之久亚州精品露出| 97视频在线观看亚洲| 久久人人爽人人爽人人片av高请| 中文字幕亚洲综合久久筱田步美| 国产精品一区二区电影| 欧美大片免费观看在线观看网站推荐| 97人人爽人人喊人人模波多| 欧美在线欧美在线| 国产精品99久久久久久久久| 亚洲最新中文字幕| 91在线观看免费| 欧美疯狂做受xxxx高潮| 亚洲精品日韩在线| 亚洲人成网7777777国产| 欧洲日本亚洲国产区| 国产偷国产偷亚洲清高网站| 国产一区红桃视频| 国产精品女人网站| 国产精品久久久久久久久粉嫩av| 久久男人资源视频| 欧美在线视频观看免费网站| 2019中文字幕在线| 欧美男插女视频| 国产亚洲美女久久| 欧美日韩亚洲成人| 亚洲v日韩v综合v精品v| 国产精品欧美一区二区| 欧美另类交人妖| 黑人巨大精品欧美一区二区免费| www亚洲精品| 日韩视频永久免费观看| 久久国产精品久久国产精品| 91精品国产综合久久香蕉最新版| 38少妇精品导航| 久久精品99国产精品酒店日本| 精品国产乱码久久久久久天美| 91精品免费视频| 午夜精品福利在线观看| 成人国产精品日本在线| 国产精品日韩精品| 亚洲va电影大全| 久久夜色精品国产| 欧美日韩免费网站| 欧美日韩中文在线| 欧美电影免费播放| 欧美综合在线观看| 国产玖玖精品视频| 亚洲毛片在线观看.| 国产精品久久久91| 国产成人精品免高潮费视频| 欧美一级成年大片在线观看| 亚洲аv电影天堂网| 久久久成人精品| 日韩欧美成人区| 亚洲曰本av电影| 国产91成人在在线播放| 日韩av片免费在线观看| 日韩美女视频在线观看| 国产精品男人爽免费视频1| 在线亚洲午夜片av大片| 国语自产精品视频在免费| 久久精品亚洲精品| 欧美精品videosex性欧美| 在线一区二区日韩| 亚洲精品xxx| 日韩最新在线视频| 日本人成精品视频在线| 九九视频这里只有精品| 成人欧美一区二区三区在线湿哒哒| 久久久久99精品久久久久| 亚洲午夜激情免费视频| 欧美国产日韩中文字幕在线| 国产视频自拍一区| 亚洲国产精彩中文乱码av在线播放| 日韩在线观看av| 黑人巨大精品欧美一区二区一视频| 国产一区二区日韩| 青青a在线精品免费观看| 国产欧美精品一区二区三区-老狼| 国语自产精品视频在免费| 亚洲男人的天堂在线| 欧美日韩视频免费播放| 91免费视频国产| 欧美激情手机在线视频| 国产一区二区三区精品久久久| 亚洲精品成人久久久| 日韩在线中文字| 国产精品扒开腿做爽爽爽的视频| 亚洲综合中文字幕在线观看| www.日本久久久久com.| 国产精品盗摄久久久| 精品动漫一区二区三区| 欧美精品在线观看91| 国产剧情日韩欧美| 亚洲精品免费av| 日韩av一卡二卡| 久久久久久12| 欧美视频二区36p| 欧美乱妇40p| 亚洲综合中文字幕68页| 亚洲日韩欧美视频| 久久久久久中文| 国产精品影片在线观看| 91精品视频在线| 精品久久久国产| 国产精品久久久| 国产欧美一区二区三区在线看| 91九色精品视频| 亚洲精美色品网站| 伊人久久免费视频| 精品亚洲va在线va天堂资源站| 日韩高清电影好看的电视剧电影| 久久精品青青大伊人av| 日韩av大片在线| 欧美亚洲日本黄色| 亚洲最大激情中文字幕| 亚洲香蕉伊综合在人在线视看|