【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 地址。
相關推薦
【iOS】Socket/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
【php】jquery中$.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
【.NET】Socket通訊
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 代理傳值 主線程與子線程常常須要進行數據的傳遞。不同的類之間,不同的控制器之間都須要。 並且常常須要監聽一個動作的完畢。而後才去做對應事件。(代理是一對一的關系)。 一、代理傳值 代理
【iOS】UICollectionView自己定義Layout之蜂窩布局
with top http reserve src 布局 step object .com 網上的UICollectionView的Layout布局,其cell的形狀多為矩形和圓形。 本篇博文將正六邊形作為cell的基本形狀,為您展現獨特的蜂窩布局效果及實現源代碼。 幫
【iOS】UIDynamicAnimator動畫
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 淺拷貝和深拷貝 淺拷貝即指針拷貝,可以認為是給一只狗加了一條繩子;深拷貝不但拷貝了對象的指針,還在系統中在分配了一塊內存用來存放拷貝對象的內容,可以認為是產生了一條帶繩子的新狗。即淺拷貝是兩根繩子一條狗
【iOS】Jenkins持續集成iOS包
edi 節點 path num nco visio os包 接下來 運行 今天項目經理說讓APP端做一下用Jenkins做持續集成,因為之前沒有做過,所以就開始了解,終於在鍵哥的幫助下,完成了持續集成的功能,感動的不行,在這裏感謝鍵哥。 因為公司的Jenkins是搭
【iOS】中間透明的引導蒙層
需求 如圖口袋蜜蜂app一鍵海報的新手指引圖,需求是遮罩層中間透明的,把底層的第一張海報顯示出來,如圖: 實現 通過UIBezierPath和CAShapeLayer繪製一張中間為透明的黑色半透明遮罩層。 步奏1、新建類PCOnePosterGuide繼承自UIVie