1. 程式人生 > >【iOS】Socket/TCP 通訊 傳送 NSString 字串格式資料

【iOS】Socket/TCP 通訊 傳送 NSString 字串格式資料

Socket/TCP 原理這裡就不闡述了,網上一搜一大堆,直接上關鍵程式碼。
【注】iOS 目前有非常著名的第三方庫 CocoaAsyncSocket 可以使用,但是我們專案當時做大資料上報要求直接傳送 NSString 格式資料,所以自己寫了一個簡易版 TCP 連線,可以實現傳送和接收資料,經過時間考驗,不存在閃退情況。
  • 1、TCPClient.h 程式碼
#import <Foundation/Foundation.h>
@interface TCPClient : NSObject

@property (nonatomic, assign) int clientSocket;
@property (nonatomic, assign) int result; + (TCPClient *)shareTCPClient; //建立連線 - (BOOL)connection:(NSString *)hostText port:(int)port; //傳送字串資料 - (void)sendStringToServerAndReceived:(NSString *)message; //斷開連線 - (void)disConnection; @end
  • 2、TCPClient.m 程式碼
#import "TCPClient.h"
#import <sys/socket.h>
#import <netinet/in.h> #import <arpa/inet.h> #define TCPHOSTADDNUM **ip地址** @implementation TCPClient static TCPClient * tcpClient = nil; + (TCPClient *)shareTCPClient { @synchronized(self) { if (!tcpClient) { tcpClient = [[TCPClient alloc]init]; } } return
tcpClient; }
  • 2.1、通過域名建立連線,hostText:域名地址 port:埠號
- (BOOL)connection:(NSString *)hostText port:(int)port {

    /**
     socket   引數
     domain:  協議域,AF_INET(IPV4的網路開發)
     type:    Socket 型別,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,報文)
     protocol:IPPROTO_TCP,協議,如果輸入0,可以根據第二個引數,自動選擇協議
     return:  if > 0 就表示成功
     */

    self.clientSocket = - 1;
    self.clientSocket = socket(AF_INET, SOCK_STREAM, 0);

    if (self.clientSocket > 0) {
        NSLog(@"socket 連線成功: %d", self.clientSocket);
    } else {
        NSLog(@"socket 連線失敗");
        return NO;
    }

    //通過域名獲取Ip地址
    NSString * tcpIp = [self obtainTCPIpAddressWithHost:hostText];

    //Connect
    struct sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_addr.s_addr = inet_addr(tcpIp.UTF8String);
    serverAddress.sin_port = htons(port);
    self.result = connect(self.clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));

    if (self.clientSocket > 0 && self.result >= 0) {
        NSLog(@"connect 連線成功");
        return YES;
    }else {
        NSLog(@"connect 連線失敗");
        [[TCPClient shareTCPClient] disConnection];
        return NO;
    }
}
  • 2.2、 通過域名獲取 IP 地址
- (NSString *)obtainTCPIpAddressWithHost:(NSString *)hostAdd {

    NSString * tcpIpStr;
    struct hostent * host_entry = gethostbyname([hostAdd UTF8String]);
    char IPStr[64] = {0};
    if(host_entry != 0) {

        sprintf(IPStr, "%d.%d.%d.%d",
                (host_entry->h_addr_list[0][0]&0x00ff),
                (host_entry->h_addr_list[0][1]&0x00ff),
                (host_entry->h_addr_list[0][2]&0x00ff),
                (host_entry->h_addr_list[0][3]&0x00ff));

        char * ip = inet_ntoa(*((struct in_addr *)host_entry->h_addr));
        tcpIpStr = [NSString stringWithFormat:@"%s", ip];
        NSLog(@"通過域名得到:%@", tcpIpStr);
    }else {
        tcpIpStr = TCPHOSTADDNUM;
        NSLog(@"通過IP得到:%@", tcpIpStr);
    }
    return tcpIpStr;
}
  • 2.3、傳送 NSString 資料
//傳送和接收字串
- (void)sendStringToServerAndReceived:(NSString *)message {

    if (self.clientSocket > 0 && self.result >= 0) {

        //不加下面的程式碼,如果在傳送資料的途中伺服器斷開連線,會閃退。
        sigset_t set;
        sigemptyset(&set);
        sigaddset(&set, SIGPIPE);
        sigprocmask(SIG_BLOCK, &set, NULL);
        ssize_t sendLen = send(self.clientSocket, message.UTF8String, strlen(message.UTF8String), 0);
        NSLog(@"傳送的TCP資料長度 == %ld", sendLen);
        if (sendLen > 0) {
            [self performSelectorInBackground:@selector(readStream) withObject:nil];
        }
    }else {
        //傳送的時候如果連線失敗,重新連線。
    }
}
  • 2.4、接收資料
//接收資料
- (void)readStream {

    /**
     第一個int:建立的socket
     void *:  接收內容的地址
     size_t:  接收內容的長度
     第二個int:接收資料的標記 0,就是阻塞式,一直等待伺服器的資料
     return:  接收到的資料長度
     */
    char readBuffer[1024] = {0};
    long OrgBr = 0;
    OrgBr = recv(self.clientSocket, readBuffer, sizeof(readBuffer), 0) < sizeof(readBuffer);
    NSLog(@"\nbr = %ld\nReceived Data:%s\n", OrgBr, readBuffer);
    memset(readBuffer, 0, sizeof(readBuffer));
    NSString * readString = [NSString stringWithUTF8String:readBuffer];
    if (readString && ![readString isKindOfClass:[NSNull class]] && readString.length > 0) {
        //接收到的資料 NSString 可以自己做相關的操作
    }else {
        //重新連線
    }
}
  • 2.5、 斷開 Socket 連線
//斷開連線
- (void)disConnection {

    if (self.clientSocket > 0) {
        close(self.clientSocket);
        self.clientSocket = -1;
    }
}

全部程式碼已經貼出來了,如需要 Demo 的可以加 Q:694245052 後續增加 GitHub 地址。

相關推薦

iOSSocket/TCP 通訊 傳送 NSString 字串格式資料

Socket/TCP 原理這裡就不闡述了,網上一搜一大堆,直接上關鍵程式碼。 【注】iOS 目前有非常著名的第三方庫 CocoaAsyncSocket 可以使用,但是我們專案當時做大資料上報要求直接傳送 NSString 格式資料,所以自己寫了一個簡易版 TCP 連線,

iOS通過NSURLProtocol實現網頁載入本地快取資料

一.專案需求 專案中有個海報生成功能,使用UIWebView載入一些網頁,因為海報使用率比較高,有時載入網頁比較慢會影響使用者體驗,因此我們在APP啟動後,將一些固定資源,如css、圖片等,先快取到本地。載入網頁時,通過NSURLProtocol,優先使用本地的檔案,以加快網頁載入速

iOS(swift)AFNetworking3傳x-www-form-urlencode資料

使用AFNetworking框架傳x-www-form-urlencode資料伺服器一直返回引數不存在的錯誤。 let manager = AFHTTPSessionManager() manager.requestSerializer = AFHTTPRequestSerializ

phpjquery中$.get實現解析json格式資料及jsonp跨域

一直以來都是寫ajax都是使用$.getjson這個方法,主要圖的就是跨域方便,當然跨域有時候也會帶來不安全的隱患,現在專案中是$get,例子中基本上返回的是string格式,自己寫getjson寫習慣,想返回json格式的。下面就介紹三種實現json格式返回的方法。

Android Socket專題TCP通訊伺服器端app的demo的實現

----這篇實現以下TCP 伺服器,另外由於實在不是想在重複工作了,所以關於tcp多連線伺服器程式碼直接提供思路放在這邊了,單一使用請自行刪除和移位相關程式碼即可,原理是一樣的,實現方法也有很多種,個人這裡只實現其中一種。 首先規劃一下頁面: 附上

Android Socket專題TCP通訊客戶端app的demo的實現

------- Android TCP 客戶端實現,規劃介面如下: 對應XML程式碼如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" a

翻譯java-TCP-socket網絡編程1

底層 停止 bytes 大小 cli 有客 緩沖 什麽 java-tcp   參考網址:http://tutorials.jenkov.com/java-networking/sockets.html   我自己學習時做的一個總結,不妥之處請各位大哥指教,小弟先謝過!!  

iOS第02講 多執行緒NSThread/GCD/RunLoop/NSTimer/Socket資料傳輸

一、NSThread       1.1 基本使用 -(void) createThread{               //NSThread   &nb

1、網路程式設計Socket/TCP/UDP/HTTP/HTTPS/網路分層模型

一、簡介 1、相關概念     TCP:傳送控制協議(Transmission Control Protocol)     UDP:使用者資料報協議 (UDP:User Datagram Protocol)     HTTP:全稱是HyperText Transfer Pro

.NETSocket通訊

TCP/IP模型概述 1、OSI參考模型把計算機網路通訊定義為七層框架模型 2、後來出現了TCP/IP模型,分為四個層次 **鏈路層:**網路硬體 網路層: IP層,主要把分組發往目標網路或主機 傳輸層: 提供端到端的資料通訊,它分為兩個不同的協議:TCP和UD

翻譯java-TCP-socket網路程式設計2

我搬家到部落格園了。。。。 URL url = new URL("http://jenkov.com");//新建一個URL URLConnection urlConnection = url.o

iOS字串NSString中去掉空格

轉載自:http://hi.baidu.com/dajian_ecjtu/item/0a61d297b96b58f8291647bb 【問題描述】      某些情況下,伺服器返回的欄位中含有空格,這空格是伺服器開發人員不小心往資料中多敲了,但客戶端需要保護,所以在客戶端需

iOS代理傳值與塊代碼傳值

ring 方法 nslog 設置代理 轉載 adf delegate alloc 代理傳值 主線程與子線程常常須要進行數據的傳遞。不同的類之間,不同的控制器之間都須要。 並且常常須要監聽一個動作的完畢。而後才去做對應事件。(代理是一對一的關系)。 一、代理傳值 代理

iOSUICollectionView自己定義Layout之蜂窩布局

with top http reserve src 布局 step object .com 網上的UICollectionView的Layout布局,其cell的形狀多為矩形和圓形。 本篇博文將正六邊形作為cell的基本形狀,為您展現獨特的蜂窩布局效果及實現源代碼。 幫

iOSUIDynamicAnimator動畫

set translate logs enc ica cgpoint isp mat .cn 創建動畫 1 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:sel

ESP8266、ESP8266通訊使用的AT指令

可用 本地ip border station 查詢參數 pcl 內部 執行 通訊 一、AT指令介紹   AT(Attention), AT指令一般應用於終端設備和PC應用之間建立連接。通過AT指令來控制。 二、常用AT指令   AT指令主要分為: 基礎AT指令,WIFI功能

python全棧開發基礎補充解決tcp粘包

技術 服務端 消息 log 完成後 open unpack div pytho 一、什麽是粘包 須知:只有TCP有粘包現象,UDP永遠不會粘包 粘包不一定會發生 如果發生了:1.可能是在客戶端已經粘了       2.客戶端沒有粘,可能是在服務端粘了 首先需要掌握一個soc

iOS淺拷貝和深拷貝

簡單 HR 除了 深淺拷貝 感謝 with 分配 指針 object 淺拷貝和深拷貝 淺拷貝即指針拷貝,可以認為是給一只狗加了一條繩子;深拷貝不但拷貝了對象的指針,還在系統中在分配了一塊內存用來存放拷貝對象的內容,可以認為是產生了一條帶繩子的新狗。即淺拷貝是兩根繩子一條狗

iOSJenkins持續集成iOS

edi 節點 path num nco visio os包 接下來 運行   今天項目經理說讓APP端做一下用Jenkins做持續集成,因為之前沒有做過,所以就開始了解,終於在鍵哥的幫助下,完成了持續集成的功能,感動的不行,在這裏感謝鍵哥。   因為公司的Jenkins是搭

iOS中間透明的引導蒙層

需求 如圖口袋蜜蜂app一鍵海報的新手指引圖,需求是遮罩層中間透明的,把底層的第一張海報顯示出來,如圖: 實現 通過UIBezierPath和CAShapeLayer繪製一張中間為透明的黑色半透明遮罩層。 步奏1、新建類PCOnePosterGuide繼承自UIVie