iOS端Socket连接、发送数据(一)
一、Socket的应用
IM即时通讯是通过Socket的方式实现长连接,可运用于
(1)直播聊天室、礼物
(2)微信、QQ等即时聊天
(3)游戏对话、技能等
二、SOCKET原理
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行。建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。建立连接时所需的寻址信息为IP地址和端口号
IP地址:用于区分那一台机器需要建立连接
端口号:用于区分和哪一个应用程序建立连接
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
三、iOS端使用的Socket
简单的来说,Socket是我们使用TCP/IP 或者UDP/IP协议的一组编程接口,其介于应用层和传输层之间。传输层可以选择TCP或UDP,UDP是不可靠传输,为了保证数据的可靠性,实现起来会更加复杂,所以一般项目使用TCP即可。iOS使用Socket的常用方式有如下:
(1)BSD Socket:是UNIX系统中通用的网络接口,基于C语言,比较底层
(2)CF Socket:苹果官方提供,来自于CoreFoundation框架
(3)AsyncSocket:对BSD Socket的封装,OC语言
(4)ysocket:对BSD Socket的封装,Swift语言
在下面的Swift例子中,会使用ysocket
四、客户端(iOS程序)
(1)新建项目client
(2)将ysocket添加到项目中
(3)新建HYSocket管理类,提供socket连接、发送消息、断开连接等
(4)在HYSocket中实现init(addr : String, port : Int)初始化方法,通过地址和端口号来初始化TCPClient
class HYSocket {fileprivate var tcpClient : TCPClientinit(addr : String, port : Int) {tcpClient = TCPClient(addr:addr, port:port)}
}
(5)实现connectServer()方法,实现连接Socket服务器
extension HYSocket {func connectServer() -> Bool {let temp = tcpClient.connect(timeout: 5)print(temp.1)return temp.0}
}
(6)在主函数中,初始化HYSocket类,并调用connectServer()进行连接
class ViewController: UIViewController {fileprivate lazy var socket : HYSocket = HYSocket(addr: "0.0.0.0", port: 7878)override func viewDidLoad() {super.viewDidLoad()if socket.connectServer() {print("连接上服务器")}}
}
五、服务器端(Mac OS程序)
代码:https://github.com/dolacmeng/socketConnectDemo/tree/connect/ServerDemo
六、测试连接
(1)运行服务器端(Mac程序),点击开启
(2)运行客户端(iOS程序),服务器和客户端Socket连接成功后,打印出连接成功:
连接的完整代码:https://github.com/dolacmeng/socketConnectDemo/tree/connect
七、发送消息
TCP在传输数据时,传输的是字节流,因此在读取消息时,需要知道数据的长度,否则会出现读取不完整或读取过多的情况。可以通过【长度数据+真实数据】的方式传输数据
1.在HYSocket类中,添加发送消息的方法
extension HYSocket {//...func sendMsg(data : Data){tcpClient.send(data: data)}
}
2.在HYSocket类中,继续添加发送文字消息方法
func sendMsg(message: String) {//1.获取消息长度let data = message.data(using: .utf8)!print(data.count)var length = data.count//将消息长度写入datalet headerData = Data(bytes:&length, count: 4)//发送消息let totalData = headerData + datasocket.sendMsg(data: totalData)
}
3、简单布局界面,并在相应的点击方法中,调用HYSocket对应方法:
class ViewController: UIViewController {fileprivate lazy var socket : HYSocket = HYSocket(addr: "0.0.0.0", port: 7878)@IBOutlet weak var contentTextField: UITextField!override func viewDidLoad() {super.viewDidLoad()}//点击发送@IBAction func clickSend(_ sender: UIButton) {guard let content = contentTextField.text else{return}socket.sendMsg(message: content);}//点击连接@IBAction func clickConnect(_ sender: UIButton) {if socket.connectServer() {print("连接上服务器")socket.sendMsg(message: "您好啊,服务器");}}@IBAction func clickDisconnect(_ sender: UIButton) {}
}
服务器端读取数据核心代码:
//获取数据长度的data
let lMsgData = Data(bytes: lMsg, count: 4)
var length : Int = 0
(lMsgData as NSData).getBytes(&length, length: 4)//根据长度读取消息
guard let msg = tcpClient.read(length) else{return
}
let msgData = Data(bytes: msg, count: length)
let msgString = String(data: msgData, encoding: .utf8)
print(msgString!)
4.测试:客户端点击连接,然后输入要发送的文字,点击发送:
八、心跳包
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。
在本例中,在Socket连接成功后,开启一个定时服务,每隔9秒发送一次消息给服务器,跟服务器约定好心跳包的内容,将上文中的clickConnect函数修改为:
//点击连接@IBAction func clickConnect(_ sender: UIButton) {if socket.connectServer() {print("连接上服务器")socket.startReadMsg()socket.sendMsg(message: "您好啊,服务器");//定时发送心跳包timer = Timer(fireAt: Date(), interval: 8, target: self, selector: #selector(sendHeartBeat), userInfo: nil, repeats: true)RunLoop.main.add(timer, forMode: .commonModes)}}
实现上面代码的sendHeartBeat方法
extension ViewController{@objc fileprivate func sendHeartBeat(){socket.sendHeartBeat()}
}
在HYSocket中,实现发送心跳包的方法
func sendHeartBeat() {//心跳包数据let heartString = "i am a heart beat" //发送心跳包数据sendMsg(message: heartString)}
用来判断对方(设备,进程或其它网元)是否正常运行
下一篇:通过ProtocolBuffer来封住啊消息内容并发送:
https://blog.csdn.net/dolacmeng/article/details/81136635
本篇完整代码:https://github.com/dolacmeng/socketConnectDemo/tree/sendMsg
相关文章:

dataTable 从服务器获取数据源的两种表现形式
1 var table $(#example1).DataTable({2 "processing": true,//加载效果3 "autoWidth": false,4 "iDisplayLength": 25,//设置每页要显示的条数5 "lengthMenu": [[25, 50, 100], [25, 50, 100]],//设…

干货!链家二手房数据抓取及内容解析要点
“本文对链家官网网页进行内容分析,可以作为一般HTTP类应用协议进行协议分析的参考,同时,对链家官网的结构了解后,可以对二手房相关信息进行爬取,并且获取被隐藏的近期成交信息。”另外,近期将对包含登录帐…

Atitit.软件兼容性原理与实践 v3 q326.docx
Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api vs 修改旧的api1 3. Web方面的兼容性(js,html)1 3.1. Threadlocal2 4. 数据库表兼容性2 4.1. 2. 扩展表模式2 5. 兼容性策略2 5.1. Atitit.兼容性的“一…

用PULL解析器解析XML文件
第一种方式(简洁,直接用pullparser.nextText()来返回下一个String类型的值): 1 package lee.service; 2 3 import java.io.InputStream; 4 import java.util.ArrayList; 5 import java.util.List; 6 import org.xmlpull…
iOS端Socket(二)ProtocolBuffer使用
ProtocolBuffer使用 一、环境及ProtocolBuffer的安装 分别在终端执行以下命令: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew install protobuf-swift brew install automake brew install libtoo…

Wireshark分析实战:某达速递登录帐号密码提取
“使用某达速递的官网登陆及APP登录,来学习Wireshark的使用。”在如今这个HTTPS深入人心的情况下,作为一个也不算很小的快递,某达速递,不但全站HTTP,而且登录帐号密码明文未加密传输,也算是技术落后到了一定…
【并行计算-CUDA开发】从零开始学习OpenCL开发(一)架构
多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我《从零开始做OpenCL开发》系列文章的第一篇。 1 异构计算、GPGPU与OpenCL OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算…

使用 fcntl 函数 获取,设置文件的状态标志
前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 )。那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志。 解决思路 1. 对于获取文件状态标志,…
UILabel显示带颜色边的文字
需求如图,UILabel要实现带红色边的文字显示。 1、新建UILabel的子类JXBorderLabel 2、重写drawRect:方法 #import "JXBorderLabel.h"implementation JXBorderLabel- (void)drawRect:(CGRect)rect {//1.获取上下文CGContextRef context UIGraphicsGe…
协议分析中的TCP/IP网络协议
“ TCP/IP协议作为互联网的基础,在协议分析中不可或缺,本文介绍在对协议进行分析还原的过程中的一些要点,快速掌握协议还原的精髓。” 注意,本文比较枯燥乏味,若非需要了解TCP/IP协议相关信息,建议绕行。 …

忠告初学者学习Linux系统的8点建议
忠告初学者学习Linux系统的8点建议新手或者说即将要入坑的小伙伴们,常常在QQ群或者在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:如何给添加的用户归属用户组,复制整个文件到另一个目录下面&#x…

iOS显示gif图片的几种方法
方法一、传统方式 //1.加载Gif图片,转换成Data类型NSString *path [NSBundle.mainBundle pathForResource:"demo" ofType:"gif"];NSData *data [NSData dataWithContentsOfFile:path];//2.将data数据转换成CGImageSource对象CGImageSourceRe…

简单文件传输协议TFTP分析还原
“ 介绍TFTP协议及传输内容的还原。”TFTP,全称为Trivial File Transfer Protocol,即简单文件传输协议,是一个用来在客户端与服务器之间进行简单文件传输的协议,UDP承载,它真的很简单。其协议标准为RFC1350,…

Oracle中的字符处理方法
向左补全字符串lpad(字段名,填充长度,填充的字符) select lpad(1,4,0) from dual; 向右补全字符串rpad(字段名,填充长度,填充的字符) select rpad(1,4,0) from dual; 返回字符串小写select lower(STUDENT) from dual; 返回字符串大写select upper(admin) from dual; 单词首字符…

fwt优化+树形DP HDU 5909
1 //fwt优化树形DP HDU 59092 //见官方题解3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/4 5 #include <bits/stdc.h>6 // #include <iostream>7 // #include <cstdio>8 // #include <cstdlib>9 // #include <algorithm> 10 // #inclu…
iOS直播(二)GPUImage音视频采集
上文中介绍了用AVFoundation实现音视频采集(https://blog.csdn.net/dolacmeng/article/details/81268622) ,开源的基于GPU的第三方图像处理库GPUImage对AVFoundation进行了进一步的封装,打开GPUImgeVideoCamera.m查看代码…

Wireshark使用技巧:提取VOIP通话中的音频流
“Wireshark的RTP流分析功能实战。”在VOIP协议的分析过程中,常常会遇到一些标准协议承载的语音传输,如以SIP、H.323为控制协商协议,RTP为语音数据协议的VOIP传输情况。在语音协议的分析过程中,需要提取的一个重要项是语音内容&am…

在预装win8的电脑上换win7系统讲解
现在买电脑,如果电脑预装的系统是win8系统,那么这个电脑的默认启动模式应该就是UEFI模式,现在UEFI模式正在逐渐取代传统模式。UEFI启动需要一个独立的分区,它将系统启动文件和操作系统本身隔离,可以更好的保护系统的启…
iOS直播(三)GPUImage音视频采集并写入文件
上一篇介绍了用GPUImage图像处理库进行图像采集,从而避免了直接使用AVFoundation(AVKit)时繁琐的代码,同时不用熟悉OpenGL ES也可以快速地对图像进行美颜、添加滤镜等。这一篇介绍如果使用多个滤镜以及录制视频,并保存…

使用Wireshark进行DNS协议解析
“ DNS协议格式解析及说明。”DNS即域名系统(Domain Name System),是用来将域名与IP地址建立映射的协议,通过DNS协议,可以方便记忆。DNS可基于TCP或UDP,使用53号端口,常见的是使用UDP承载&#…

iOS直播(四)对视频进行压缩编码
1.为什么要进行编码? 不经过压缩编码的原视频,所占空间大,不便于保存和网络传输,所以视频录制完后,需要先编码,再传输,解码后再播放。 2.视频为什么可以被压缩? 视频存在冗余信息࿰…

nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战
前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏。因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64的二维数组,更新显示时将整个数…

.net卸载程序制作
.net卸载程序制作 原文:.net卸载程序制作方法一: 在打包项目中添加文件msiexec.exe(一般在c:\windows\system32(系统目录中)找到)。 在文件系统视图中选择应用程序文件,在msiexec.exe上单击右键选择“创建快捷方式”,重命名快捷方式为“unins…

Windows下的DNS命令用法
“Windows下DNS相关命令的用法。”在协议分析过程中,经常会遇到一种情况,一次对某域名抓包的过程中,抓到了某个域名的DNS请求,之后再抓包,却抓不到的情况。这时候就需要DNS命令出马了,本文介绍Windows下的D…

Kafka集群配置说明
#kafka数据的存放地址,多个地址的话用逗号分 log.dirs/tmp/kafka-logs #broker server服务端口 port9092 #这个参数会在日志segment没有达到log.segment.bytes设置的大小,也会强制新建一个segment会被 topic创建时的指定参数覆盖 log.roll.hours24 #是否…

Tomcat漏洞说明与安全加固
Tomcat是Apache软件基金会的一个免费的、开放源码的WEB应用服务器,可以运行在Linux和Windows等多个平台上,由于其性能稳定、扩展性好、免费等特点深受广大用户的喜爱。目前,互联网上绝大多数JAVA WEB应用都运行在Tomcat服务器上。 Tomcat作为…

《人性的优点》笔记
1.相信自己,做一个成功的人 2.《圣经》中说:“攻克己心,强如攻城” 3.人最大的敌人,不是别人,正是自己 4.不要为木已成舟的事情耗费太多的心血,你无法改变它 5.忧虑是健康的大敌,它只会让你的生…

SIP协议分析
“ 音视频通话控制协议SIP介绍。”SIP(Session Initiation Protocol),即会话发起协议,在RFC2543、RFC3261等中被定义,是一个VOIP信令协议,其目的是在IP网络中实现电话功能,即软电话功能。在互联…

Struts2的工作原理
Struts2是在Struts1的基础上发展而来的,Struts是WebWork和Struts1的集合,采用的正是WebWork的核心,更多的是WebWork。 下载的Struts2源代码文件 主要的包和类: 包名 说明 org.apache.struts2. components 该包封装视图组件&…

Tiny4412 Uboot
1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用。 b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录 tar xzf uboot_tiny4412-20130729.tgz c) 配置 uboot 并编译 cd uboot_tiny4412 m…