【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 TCPClientstatic 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];//Connectstruct 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:创建的socketvoid *: 接收内容的地址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 地址。
相关文章:
[Win]进程间通信——邮槽Mailslot
进程间通信 进程的地址空间是私有的。出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义。但是在一些具体的应用情况下需要多个进行相互配合,有时计算机用户也…

OpenStack环境搭建(五:附加项虚拟机文件备份使用)
实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

IOS入门-TargetAction
创建一个UIButton 并用Target - Action来监听它的点击事件 Target -- self控制器 Action -- 具体动作,self控制器中的某个方法 forControlEvents:UIControlEventTouchUpInside -- 表示监听的事件 1 - (void)btnclick:(id)sender2 {3 NSLog("点击%" ,…

【iOS_Development】文件操作
原文链接:http://www.jianshu.com/p/c5820ab6836biOS 文件操作 —— 由anticipate_91分享NSFileManager:是用来管理文件系统的,它可以用来进行常见的文件\文件夹操作获取NSFileManager示例[NSFileManager defaultManager] 增删改查 1. 创建文…
仿人智能控制器的参数简化(已发表于《计算机测量与控制》2013年第4期)
转载于:https://www.cnblogs.com/snake-hand/p/3153313.html

OpenStack环境搭建(六:常见问题及解决方案总结)
实验要求: 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署Fuel Master节点;在virtual box虚拟平台上部署计算节点Computer;在virtual box虚拟平台上部署控制节点Controller;在web控…

工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。 先来看名词解释。 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 版本库(Repository) 工…

Lucene类介绍
IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。 Analyzer luceneAnalyzer new StandardAnalyzer(); IndexWriter indexWriter new IndexWriter(indexDir, luceneAnalyzer, true );…
iOS 开发之沙盒机制 文件操作 (NSFielManager)
原文链接:http://www.jianshu.com/p/349855b5a8aeiOS APP 可以在自己的沙盒里读写文件,但是,不可以访问其他 APP 的沙盒。每一个 APP 都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过 URL Scheme。沙盒里面的文…

手动部署OpenStack环境(一:Virtual Box 5.1 环境的安装及配置)
任务一、Virtual Box 5.1 环境的安装及配置 1.1、安装环境检查 1.2、创建安装目录 1.3、安装及配置 实验目的及要求 完成Virtual box平台安装,会应用相关操作;在virtual box虚拟平台上部署网络节点Network;在virtual box虚拟平台上部署计算…

iOS动画系列之九:实现点赞的动画及播放起伏指示器
iOS动画系列,共十篇。现在写到第九篇啦。感兴趣的可以通过下面的传输门进到其他几篇文章里面。 第一篇:iOS动画系列之一:通过实战学习CALayer和透视的原理。做一个带时分秒指针的时钟动画(上) 第二篇:iOS动画系列之二:…

MySql5.7环境搭建
1. 安装mysql的linux系统 [rootgrewan ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [rootgrewan ~]# uname -a Linux grewan 2.6.32-573.26.1.el6.x86_64 #1 SMP Wed May 4 00:57:44 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [rootgrewan ~]# 注意:l…

Toad 修改起始窗口
Toad默认窗口时Editor, 如果想要修改为Schema Browser可以通过以下步骤进行修改(以Toad9.6为例): 1,点击菜单栏上的View下拉菜单 2,选择Toad Options...菜单 3,在打开窗口的左边功能列表中找到并…

手动部署OpenStack环境(二:CentOS6.6虚拟机的安装及配置)
任务二、CentOS 6.6虚拟机的安装及配置 2.1、安装环境检查 2.2、安装及配置controller0节点 2.3、安装及配置computer0节点 2.4、安装及配置network0节点 2.5、对各节点进行基础配置及服务安装 任务二:CentOS6.6虚拟机的安装及配置 2.1、安装环境检查 2.1.1在…

练习-----查询
第一步:建表 1 create table student #学生表2 (3 Sno varchar(20) primary key, #学号,主键4 Sname varchar(20) not null, #学生姓名5 Ssex varchar(20) not null, #学生性别6 Sbirthday datetime, #学生出生日期7 Class …
UIActivityViewController使用
苹果从iOS6开始,提供了一个活动列表视图,为分享和操作数据提供了一个统一的服务接口,通过UIActivityViewController来控制它的呈现和关闭,凡是继承UIActivity抽象类的子类对象都可以放在列表中呈现出来。如下图所示: 活…

SQL Server系统表sysobjects介绍与使用
关于SQL Server数据库的一切信息都保存在它的系统表格里。我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格。但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器。你可以一个一个地检查表格,但是…

手动部署OpenStack环境(三:OpenStack环境预配置)
任务三、OpenStack环境预配置 3.1、本地OpenStack yum源制作 任务三:OpenStack环境预配置 3.1、本地OpenStack yum 源制作 3.1.1、拷贝镜像文件源到本地 3.1.2、查看createrepo是否安装,并使用yum方法安装。 (此操作只在controller0主机进…

Java 集合框架(二)—— ArrayList
二、数组列表 —— ArrayList 1、构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变。 它有个带 int 类型参数的构造方法,根据传入的参数,扩展初始化的数组容量,这个方…

Linux X Window System运行原理和启动过程
本文主要说明X Window System的基本运行原理,其启动过程,及常见的跨网络运行X Window System。 一) 基本运行原理 X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服…

悬浮球 / 悬浮按钮 / 辅助按钮
原文链接:https://github.com/jinht/FloatingBall类似于 iOS 系统自带的 AssistiveTouch / 京东 / 聚划算 / 建行等的辅助按钮 —— 由anticipate_91分享FloatingBall Function Description 这是一个类似于iOS系统自带的AssistiveTouch/京东《我的》部分的悬浮按钮等…

手动部署OpenStack环境(四:安装控制器必备软件)
任务四、安装控制器必备组件 4.1、安装MySQL服务(controller0) 4.2、安装Rabbitmq消息队列(controller0) 4.3、Keystone认证(controller0) 4.4、glance的安装与配置(controller0) 4.…

cocoaPods安装、更新第三方库
pod install 换成 pod install --verbose --no-repo-update pod update 换成 pod update --verbose --no-repo-update这是因为:目前,cocoaPods正在被墙中......转载于:https://www.cnblogs.com/hello-Huashan/p/5542456.html

iOS 性能优化总结
原文链接:https://github.com/skyming/iOS-Performance-Optimization关于 iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网络优化等 —— 由_skyming_分享关于iOS 性能优化梳理: …

TCP/IP协议分析
一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了。本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体传输过程。 为了初学者…

手动部署OpenStack环境(五:新建网络及部署虚拟机)
任务五、新建网络及部署虚拟机 5.1、配置安全组规则 5.2、新建网络 5.3、创建云主机 任务五、新建网络及部署虚拟机 5.1、配置安全组规则 5.1.1、配置安全组; 5.2、新建网络。 5.2.1、创建外部网络; 5.2.2、网络地址为外部网络连接的子网地址;…

C++基础day01 程序设计方法的发展历程
类把属性和方法作了封装! 总结: 面向过程程序设计:数据结构 算法 主要解决科学计算问题,用户需求简单而固定 特点: 分析解决问题所需要的步骤 利用函数实现各个步骤 依次调用函数解决问题 问题: 软件可重用…

【android】android中activity的生命周期
activity生命周期: 实例代码: 1 public class DemoActivity extends Activity {2 3 //1、activity第一次被创建的时候,执行4 Override5 public void onCreate(Bundle savedInstanceState) {6 super.onCreate(savedIn…

Xcode消除编译器警告
Whenever,Xcode警告对于我们来说都相当重要,提醒我们可能存在的错误。但是有时候,我们知道一切都好,everything is in the palm of my hand,我们想要消除那些警告。自己项目的警告 比如我们定义一个designated initial…

手动部署OpenStack环境(六:出现的问题与解决方案总结)
排错一:keystone服务安装中demo用户表单没信息。 排错思路: 组件安装是否有问题;用户创建畲缶有问题;用户认证信息是否合适;原因:用户的认证信息配置错误。 解决方案: a)删除有关demo用户的所有…