具体如下:
首先socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。其中UDP是一种面向无连接的传输层协议。UDP不关心对端是否真正收到了传送过去的数据。
如果需要检查对端是否收到分组数谈搜据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用在分组数据较少或多播、广播通信以及视频通信等多媒体领域。
在这里芹侍粗我们不进行详细讨论,这里主要讲解的是基于TCP/IP协议下的socket通信。
socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装。
服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞。
此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面嫌镇向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
Socket 通信原理
Socket 博客地址
Socket 是一组调用接口、是 { 应用层与 TCP/IP 协议族 } 通信的中间软件抽象层 . 调用接口是 TCP/IP 协议族的 API 函数
TCP/IP协议族包括传输层、网络层、链路层 TCP、UDP、IP、ICMP、IGMP、ARP、RARP
Socket接口将复杂的首哗TCP/IP协议巧芹扮族隐藏,给用户提供一组简单的接口就是全部,让Socket去组织数据以符合指定的协议。
socket的基孝灶本 *** 作
socket()函数、bind()函数、listen()函数、
connect()函数、accept()函数、
read()函数、write()函数、close()函数等
Unix/Linux基本哲学之一就是一切皆文件
都可以用 open –>write/read –>close 模式来 *** 作
服务器端: socket() —>bind() —>listen() —>accept() —>read() || write() —>close()
—客户端: socket() —>connect() —>wirte() || read() —>close()
服务器:创建并初始化socket实例、绑定端口号、监听端口号、阻塞等待客户端连接
客户端:创建并初始化socket实例、连接服务器、连接成功即TCP双向通信通道建立
客户端发送请求数据、服务器接受请求数据、
服务器处理请求数据、
服务器发送响应数据、客户端接受响应数据、
客户端与服务器关闭连接,此双向交互结束。
最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不缓好稿够准确,还请各位路过的大牛专家指出来。这次整理的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长度为之。这样可以解决分包发送问题,也可以解决粘包问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)