---恢复内容开始---

Socket 套接字:

什么是socket:

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实

就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口

就是全部,让Socket去组织数据,以符合指定的协议。

socket在OSI模型中的位置

二为什么需要socket

在标准的OIS模型中并没有规定说必须有socket层,也就是说不使用socket也能完成通讯,是的,的确如此!

那为什么需要socket呢?一个字 懒,程序员都是懒的!

我们发现还没有开始实现应用程序逻辑,就需要花大把时间来实现各种协议,太特么费事儿了,就有人专门把协议中一堆复杂的事情进行了封装,于是socket就诞生了!

有了socket以后,无需自己编写代码实现三次握手,四次挥手,ARP请求,打包数据等等,socket已经封装好了,只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

三socket的发展:

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

基于文件类型的套接字家族:

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

基于网络类型的套接字家族:

套接字家族的名字:AF_INET

(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于大部通讯都是网络通讯,所以大部分时候使用AF_INET)

python中的socket:

需明确:关于网络协议 和socket相关概念,对于所有编程语言都是一致的,区别仅仅是各编程语言的函数名称不同

TCP协议:

1.导入socket模块

import socket

2创建TCP套接字对象,函数定义如下

server = socket.socket(scoket.AF_INET,socket.SOCK_STREAM)

或者

server = socket.socket()里面不写就是默认TCP协议的

服务端的函数:

bind()绑定主机号加端口到套接字

127.0.0.1是本机回还地址,只能在本机适用。

listen()进入监听 可以可以放监听的客户端个数,也是半链接池,就是还没有完全通过三次握手的,填5就表示最大接收5个处于半链接状态,等链接断了就从这里拿一个出来,然后再进去,防止洪水攻击。

accept()被动接受客户端的链接,阻塞式等待链接的到来。

客户端的函数:

 connect 主动链接服务端

 connect_ex 提高健壮性,出错不会报异常,而是返回错误码。

公共:

recv()接收

send()发送

这2个要一一对应,客户端是发送服务端就要收,不然会阻塞。

粘包:

问题点:因为有2点一点就是tcp协议内部的优化机制,Nikon算法,会将数据量小河发送间隔短的数据打包一起发送给对方。二就是超出了接收方的最大接收字节,下次还会继续发,直到发完。

解决:

  服务端:

    1.先写一个发送给客户端的字典

    2.制作字典的报头

    3.发送字典的报头

    4.发送字典的数据

    5.发送真实数据

  客户端:

    1.先接受字典的报头长度

    2.解包得到字典的长度

    3.得到字典的数据

    4.从字典中获取真实数据的长度

    5.接收真实数据

服务端

import socket
import subprocess
import json
import struct
server = socket.socket()
server.bind(('127.0.0.1',9696))
server.listen(5)
while True:conn,addr = server.accept()while True:try:data = conn.recv(1024).decode('utf-8')if len(data) == 0:breakobj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)msg = obj.stdout.read() + obj.stderr.read()dic = {'name':"lw",'file_size':len(msg)}json_dic = json.dumps(dic)dic_header = struct.pack('i',len(json_dic))  # 先产生字典的报头长度conn.send(dic_header)  # 先发送报头长度conn.send(json_dic.encode('utf-8'))  # 发送字典数据conn.send(msg) # 发送真实数据except ConnectionResetError:breakconn.close()

View Code

客户端

import socket
import struct
import jsonclient = socket.socket()
client.connect_ex(('127.0.0.1',9696))
while True:cmd = input('请输入指令:').strip()if len(cmd) == 0:continueclient.send(cmd.encode('utf-8'))data = client.recv(4)  # 获得字典报头大小dic_head = struct.unpack('i',data) [0] # 获得字典的长度json_dic = client.recv(dic_head) #接收字典的数据json_bytes = json.loads(json_dic.decode('utf-8'))  # 反序列化处理recv_size = 0recv_data = b''while recv_size < json_bytes.get('file_size'):data = client.recv(1024)recv_data+=datarecv_size+=len(data)print(recv_data.decode('gbk'))

View Code

---恢复内容结束---

转载于:https://www.cnblogs.com/xinfan1/p/11318168.html

Socket 套接字和解决粘包问题相关推荐

  1. 并发编程知识总结,软件开发架构,socket套接字模板,粘包问题,struct解决粘包问题,上传大文件数据,socketserver,关于操作系统的发展史,进程,线程。...

    并发编程知识总结 软件开发架构 C/S: client:客户端 server:服务端 优点:占用网络资源少,软件的使用稳定 缺点:服务端更新后,客户端也要更新,需要使用多个软件,需要下载多个客户端 B ...

  2. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字server.bind() #把地址绑定到套接字,网络地址加端口server.liste ...

  3. 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

    基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socketserver = socket.socket(socket.AF_INET,socket.S ...

  4. 网络编程(part10)--socket套接字编程之UDP套接字

    鄙人学习笔记 文章目录 UDP套接字编程 服务端流程 举个例子 客户端流程 举个例子 TCP套接字和UDP套接字编程区别 UDP套接字编程 服务端流程 创建数据报套接字 sockfd = socket ...

  5. TCP与UDP协议、socket套接字编程、通信相关操作(cs架构软件)、TCP黏包问题及解决思路

    OSI七层协议 传输层 1.PORT协议:前面讲过 2.TCP协议与UDP协议:规定了数据传输所遵循的规则(数据传输能够遵循的协议有很多,TCP和UDP是较为常见的两个) TCP协议 基于TCP传输数 ...

  6. Python攻城师的成长————网络编程(socket套接字、通信循环、链接循环、黏包问题)

    今日学习目标 学习什么是socket套接字,并依靠它去处理TCP协议等网络编程问题 文章目录 今日学习目标 学习内容 一. socket套接字 1.什么是socket 2.套接字发展史及分类 3.套接 ...

  7. c# socket 解决粘包,半包

    处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断 ...

  8. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  9. 10.python网络编程(解决粘包问题 part 2)

    一.什么时候会产生粘包现象. 只有在使用tcp协议的情况下才会产生粘包现象!udp协议永远不会! 发送端可以1k1k的把数据发送出去,接收端,可以2k2k的的去接收数据,一次可能会接收3k,也有可能1 ...

最新文章

  1. CCIE实验之路由重分布之重分布的原则
  2. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
  3. mysql安装后创建,Mysql安装创建删除
  4. LOG4J 警告错误处理办法(转)
  5. Python安装Whl文件
  6. 快速掌握用python处理Excel
  7. MTK 驱动(63)---MTK TP驱动移植
  8. USB 3.0 是什么
  9. (SAE)skylark app engine preview (1) —— guestbook
  10. 滴滴开源基于 React 的移动端开发组件库-Pile.js
  11. JS常用事件兼容性处理方法
  12. c语言代码怎么转成java,急C语言代码转成java代码,该如何解决
  13. Serializer及ModelSerializer的使用
  14. 一种针对图数据超级节点的数据建模优化解决方案
  15. MongoDB客户端命令总结
  16. Temporal Action Proposal
  17. Spring官宣,干掉原生 JVM!硬气啊!
  18. 【STM32】入门(零):keil安装、科学使用、芯片包安装
  19. python写的小巧的(14行有效代码)随机密码生成小脚本工具
  20. css除法,CSS calc()百分比余数乘除法

热门文章

  1. java发布rest服务器_ArcGIS Server 10 Java 版的Rest服务的部署方法
  2. linux ssh客户端_Linux终端连接Linux服务器
  3. JavaScript文档对象模型document对象获取自定义属性值和设置移除自定义属性(5)
  4. java多线程上传文件_Java大文件分片上传/多线程上传
  5. poj1700快速渡河问题(贪心策略,详细解析)
  6. 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
  7. bzoj 1833: [ZJOI2010]count 数字计数(数字0-9的个数)
  8. bzoj 1053: [HAOI2007]反素数ant 51nod-1060:最复杂的数(反素数与因数个数计算)
  9. java发送接收组播(多播)数据包(UDP包)
  10. tf.shape()和tf.reshape()