一、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

iOS端Socket连接、发送数据(一)相关推荐

  1. iOS端给unity发送消息,实现两者交互。

    上一篇我们简单说了一下unity发消息给iOS端.现在我们就来说一下iOS端给unity发送消息的简单使用. 首先iOS端做得事情其实很简单就一句话,直接上代码 /*** 第一个参数:是unity那边 ...

  2. 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送

    说明:苹果官方开发文档中涉及一些名词:Central(中心设备).Peripheral(外围设备).advertising(广告).Services(服务).Characteristic(特征)等,请 ...

  3. Powerbuilder 使用Socket函数发送数据

    天想使用pb10来操作socket函数, 在这里写个测试代码,以作备用. PowerBuilder 测试代码: API函数声明 FUNCTION Long WSAStartup ( Integer w ...

  4. C# Socket tcp 发送数据大小问题

    TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的 ...

  5. iOS端Socket(二)ProtocolBuffer使用

    ProtocolBuffer使用 一.环境及ProtocolBuffer的安装 分别在终端执行以下命令: ruby -e "$(curl -fsSL https://raw.githubus ...

  6. matlab用socket线程发送数据,使用Python Twisted和Autobahn从Matlab通过WebSocket发送JSON数据...

    我正在尝试创建一个从Matlab到WebSocket流JSON帧的连接.我用下面的代码测试了我的python安装和twisted.在 工作实例 Matlab代码 示例驱动程序代码,它使用JSONlab ...

  7. linux非阻塞的socket发送数据出现EAGAIN错误的处理方法

    一.非阻塞socket 非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回.比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上.在 ...

  8. 【学习笔记】在windows下进行基于TCP的本地客户端和服务端socket通信

    文章目录 socket介绍 java中使用socket 基于tcp的socket通信 使用ServerSocket类创建一个web服务器:(java) windows下的基于tcp的socket编程( ...

  9. Java面试题17 牛客 下面哪个选项正确创建socket连接?

    Java面试题17 牛客 下面哪个选项正确创建socket连接? Socket s = new Socket(8080); Socket s = new Socket("192.168.1. ...

最新文章

  1. Linux echo 显示内容颜色
  2. 用两张图告诉你,为什么你的App会卡顿?
  3. linux history操作的路径,绝对路径和相对路径,目录命令(cd,mkdir,rm,history)
  4. 王道 —— 进程互斥的软件实现方法
  5. php提供的魔术常量
  6. 读取jar包所在目录和jar包内文件
  7. SharePoint Designer - View
  8. MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
  9. 华为第1书:《华为交换机学习指南》当当网预售中
  10. 常用汉字2504个(无重复)
  11. 四象限里的正弦、余弦和正切(四象限反正切函数的原理)
  12. (pyqt5 qml qt quick) QAbstractTableModel.columnCount() is abstract and must be overridden
  13. mysql存储过程转义字符_mysql存储过程转义字符
  14. 求两个数的最大公约数(C++)
  15. TZT3826E静态信号测试分析系统
  16. 信息学切题记录:永远的A+B Problem(洛谷P1001)
  17. 《全栈技术资料》你值得拥有 | 寻找C站宝藏
  18. 2020年5大热点网络趋势
  19. 什么是 Wireframe线框图
  20. 两种时间选择器的三种使用场景(带效果图)

热门文章

  1. 敏捷冲刺每日报告四(Java-Team)
  2. 函数的四种调用模式.上下文调用.call.apply
  3. JQuery 动态创建表单,并自动提交
  4. Ubuntu 和 Redhat / Fedora 服务管理命令对比表(附Fedora16新的服务管理工具systemctl )...
  5. PHP5.3.8连接Sql Server SQLSRV30
  6. C#实现一个用于开机启动其他程序的Windows服务
  7. 白领们注意啦:“过劳死”27个危险信号!
  8. Linux 文件系统剖析
  9. 使用Nmap获取目标服务器开放的服务以及操作系统信息
  10. ASP.NET2.0中用Gridview控件操作数据