最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来。这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己回忆。

  1、socket通信原理:现网络上有很多socket开园框架文件,基本上能满足简单网络通信,但如过你的项目需要成熟的网络通信,还需要自 己对socket好好研究完善下。socket通信分为server端和client端,开发过程中分别对应着服务器和客户端。当连接上服务器 后,socket就会启动一个while或for无限循环,不断的异步监听socket动静,看是否有read或者write动作,直到出错或者主动结 束。

    socket通信传输的都是字节流,传输时没有包的概念的。至于我们经常说的包的概念,是我们制定了一定的规则形成的。常用规则有两种,一 种是制定特定的分隔符(delimiter)来分割每个包,此时必须保证每条信息体中不包含该分隔符。第二种是指定每条消息体的长度,比如,在每条消息体 之前插入一个4字节长度的无符号整形来表明后面的消息体长度(一般包体长度限制在8k大小内,遇到消息体过大的信息时,一般采用分包发送和拼包解析)。其 中第二种方式更常见一些。

    基于TCP链接的socket通信中,经常会涉及粘包、分包、解包的问题,一下久这问题简单说一下。

    粘包:使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接 着前一包数据 的尾。粘包可能由发送方造成,也可能由接收方造成。TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连。如果 接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包。
    粘包一般的解决办法是制定通讯协议,由协议来规定如何分包解包。

    分包:常用分包的逻辑是先发一个长度,然后紧接着是数据包内容,这样就可以把每个包分开。

    解包:由于我们应用层数据包既可以传命令也可以传数据,因而针对每个包我们进行解包,分出命令和数据分别处理,因而每个Socket服务对象都需要解包。解包过程中,才会出现我们常见的包头、信息体长度、信息体。

粘包、分包、解包解决方案:东家DZH:采用的是用一个足够大(500*1024)的接受缓存pRecvBuf去读区socket(recv()),然后使用君子协定让数据报的开头都是一个标准的包头信息,包头信息中包含着本包的包体长度,利用这个包体长度曲读取本包数据包体。读完后,如果该数据包还有未读数据,则重复上诉解包操作。直到完成。

东家EM:每次收到数据报时,先读取前4个字节转为无符号整形作为本消息包的长度length,然后一直重socket中read,直到读取length长度为之。这样可以解决分包发送问题,也可以解决粘包问题。

IOS 基于TCP的socket通信详解(原创)的更多相关文章

  1. Android Socket通信详解

    一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...

  2. 基于TCP协议Socket通信

    服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...

  3. java网络编程Socket通信详解

    Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...

  4. 基于tcp的socket通信

    # socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...

  5. 基于TCP的socket通信过程及例子

    Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据.Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Sock ...

  6. Android之基于HTTP协议的通信详解

    Android系统中本身是有下载机制的,比如浏览器使用的DownloadManager.可遗憾的是,DownloadManager只提供给浏览器使用,一般的应用程序没法调用它. 另外,如果下载调用频繁 ...

  7. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

  8. Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  9. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

随机推荐

  1. 迟到的 WPF 学习 —— 路由事件

    1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...

  2. 增加窗体边框3D效果

    /// <summary> /// 增加窗体边框3D效果 /// </summary> /// <param name="e"></par ...

  3. java-并发之高性能对象

    Hadoop之RPC          Hadoop的RPC主要是通过Java的动态代理(Dynamic Proxy)与反射(Reflect)实现,代理类是由java.lang.reflect.Pro ...

  4. ShardedJedis实现学习

    ShardedJedis实现学习-我们到底能走多远系列(33) 我们到底能走多远系列(31) 扯淡: 工作是容易的赚钱是困难的 恋爱是容易的成家是困难的 相爱是容易的相处是困难的 决定是容易的可是等待 ...

  5. Python Redis 数据复制.

    1 > 下载Python操作Redis的客户端 https://pypi.python.org/pypi/redis/2.7.6 下载完成后,参考该网站相关命令,执行安装. 2 > 下载 ...

  6. .NET:国际化和本地化

    .NET:国际化和本地化 背景 国际化(i18n)和本地化(l10n)是高端程序的必备技术,可惜从业五年从没有尝试过,下一步准备做一个多用户的博客系统,想支持多语言,今天就学习了一下,写出来,希望大家 ...

  7. 用T4消除代码重复,对了,也错了

    用T4消除代码重复,对了,也错了 背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得 ...

  8. MongoDb注意事项

    1.保证足够大的内存. 2.Mongodb跟mysql一样,对于常用的查询条件,该建索引的建索引.不要认为内存够用,数据就会在内存,有时,内存够用,数据也不一定在内存. 3.使用副本集,一个主库,进行 ...

  9. ssd可以用作redo 盘吗?

                                               ssd可以用作redo 盘吗? 1.ssd有写磨损,而且ssd的写性能也不是非常好,ssd只是随机读特别好,因为 ...

  10. java--九九乘法表

    /* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:邱学伟 * 完成日期:2013 年 7 月 ...