python socket的应用 以及tcp中的粘包现象
1,socket套接字
一个接口模块,在tcp/udp协议之间的传输接口,将其影藏在socket之后,用户看到的是socket让其看到的。
在tcp中当做server和client的主要模块运用
#server
sk = socket.socket()
sk.bind(('127.0.0.1',9000))#绑定一个端口IP地址和端口
sk.listen() #接收数据
conn,addr = sk.accept() #获取接收数据的主内容和ip地址
count= conn.recv(1024).decode('utf-8') #接收过程中只能接收字节码,并且在此处设置一次接收最多1024个字节
print(count)
conn.send('HI'.encode('utf-8'))#传输数据也只能传输字节码,此处传输没有大小限制
conn.close()
sk.close()
#以上为server服务端的传输接收方式,利用socket实现 #client
sk = socket.socket()
sk.connect(('127.0.0.1',9000)) #此处为链接一个服务器
sk.send('hello'.encode('utf-8'))# 客户端需要与服务端一一对应,接收和传输需要统一配合
k = sk.recv(1024).decode# 接收服务端的信息
print(k)
sk.close()#注意关闭
#此为客户端的socket的基本联通方式
在udp中当做server和client的主要模块运用
#server端口
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
conn,addr = sk.recvfrom(1024)#与tcp的不同接收方式,tcp是accept而udp则是recvfrom,但是同样为两个参数
print(conn.decode('utf-8'))
conn.sendto('hi'.encode,addr)#由于udp支持点对点的地址传输,此时在末尾加入地址参数,点对点传输,
sk.close() #client端口
in_point = ('127.0.0.1',9000) #由于udp是可无需链接的 所以直接利用ip地址和端口号对服务端进行交互
sk = socket.socket()
sk.sendto('hi'.encode('utf-8'),in_point)
conn,addr = sk.recvfrom(1024)
print(conn.decode('ut-8'),addr) #不同于tcp协议 两边的传输和接收几乎相同,所以使用recvfrom接收的时候同样拥有两个参数 sk.close()
由于udp的特性,在联通中可以使用重构socket从而使得传输的功能和目的更好的实现。
2.tcp中的粘包现象
1,什么是粘包:利用tcp传输文件时,由于不知道哪里断句,并且第一次和第二次的传输间隔过小,则会出现被判断为一个文件,从而是的上下两个内容粘合到一起,因此产生了粘包现象
2,为什么会出现粘包:
1,同时发送多个文件,并且文件间隔时间和文件的大小都小于一个拆包空间的时候,由于tcp的内部算法会将它们整合到一起发送,就会出现粘包现象
2,发送的文件较大,超过了网口的MTU值,(一般在1500左右)在拆包的过程中分成多个小块,而在读取的时候可能将后序的文件也分到同一个小块中,从而产生粘包现象。
#注udp永远不会出现粘包现象:算法不同,而且udp有明确的区分传输的方法,传输的每段内容都有区分,因此不会出现粘包
3,解决粘包的方法:
1,获取文件的传输大小,两边统一接收和传输的数据流大小,做到不会粘包
2,利用struct模块,发送报头的方式来区分文件的传输 struct.pac('i',len(文件长度))
#server端口
import os
import json
import socket
import struct #服务器传输文件!
dic = {'filename': '02 python fullstack s11day34 tcp拾遗和udp协议.mp4',
'filesize': os.path.getsize(r'D:\python_file\python11期day34\视频\02 python fullstack s11day34 tcp拾遗和udp协议.mp4')} #设置一个字典,字典中包含文件的所有信息统一处理
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
dic = json.dumps(dic) #文件的传输利用json的方式编码传输
dic_send = struct.pack('i', len(dic)) #struct模块进行基本的报头传输
conn,addr = sk.accept()
conn.send(dic_send)
conn.send(dic.encode('utf-8'))
with open(r'D:\python_file\python11期day34\视频\02 python fullstack s11day34 tcp拾遗和udp协议.mp4','rb') as f:
while True:
k = f.read(8192) #文件的写入大小统一大小
if k:
conn.send(k)
else:break conn.close()
sk.close() ########################################################### #client端口
import os
import json
import socket
import struct #接收文
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
conn = sk.recv(4)
conn = struct.unpack('i',conn)[0] #此处接收需要注意接收的是一个元祖,第一个为被压缩的四个字节内容,是字典的长度
mag = sk.recv(conn).decode('utf-8')#再次接收的就是json后的字典
mag = json.loads(mag)#解码后获得字典中的数据
with open(r'C:\Users\Administrator\Desktop\视频\02 python fullstack s11day34 tcp拾遗和udp协议.mp4','wb') as f:
while mag['filesize']:
conn = sk.recv(8192)
mag['filesize'] -= len(conn)
f.write(conn)
# if conn:
# f.write(conn)
# else:break sk.close()
python socket的应用 以及tcp中的粘包现象的更多相关文章
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- TCP中的粘包问题,以及用TCP和UDP实现多次聊天
TCP协议 在连接内多和客户端说几句 #server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',9001)) sk.listen ...
- 基于tcp协议下粘包现象和解决方案,socketserver
一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送 ...
- TCP协议的粘包现象和解决方法
# 粘包现象 # serverimport socket sk = socket.socket()sk.bind(('127.0.0.1', 8005))sk.listen() conn, addr ...
- Python网络编程(2)-粘包现象及socketserver模块实现TCP并发
1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...
- Netty 中的粘包和拆包
Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...
- python中TCP协议中的粘包问题
TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...
- socket基于TCP(粘包现象和处理)
目录 6socket套接字 7基于TCP协议的socket简单的网络通信 AF_UNIX AF_INET(应用最广泛的一个) 报错类型 单一 链接+循环通信 远程命令 9.tcp 实例:远程执行命令 ...
- 剖析和解决Python中网络粘包的正确姿势
目录 1.粘包及其成因 1.1.粘包产生 1.2.粘包产生的原因 2.尝试解决粘包 2.1.指定数据包的长度 2.2.固定数据包的长度 2.3.用函数实现多次调用发送数据 3.解决粘包问题的正确姿势 ...
随机推荐
- 你真的掌握 LVS、Nginx 及 HAProxy 的工作原理吗
你真的掌握 LVS.Nginx 及 HAProxy 的工作原理吗 当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web ...
- 几款必备LINUX的命令行神器
Dstat & sar iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在<性能调优攻略>中提到过那三个xxstat工具). 官方网站:http:/ ...
- notepad配合正则表达式处理文本
<option value="irs01.com">irs01.com</option><option value="hdslb.com&q ...
- 021——VUE中变异方法 push/unshift pop/shift
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制
Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制 201311.27 代码下载 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 前言 ...
- vue.js 源代码学习笔记 ----- Dep
/* @flow */ import type Watcher from './watcher' import { remove } from '../util/index' let uid = 0 ...
- Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs
发送 APNS 使用 p12 文件(C#) public static bool PushWithP12(string apnToken, string message) { _log.DebugFo ...
- [置顶]
记最近一次Nodejs全栈开发经历
背景: 前段时间大部门下新成立了一个推广百度OCR.文字识别.图像识别等科技能力在金融领域应用的子部门.因为部门刚成立,基础设施和人力都是欠缺的.当时分到我们部门的任务是抽调一个人做新部门主站前端开发 ...
- iOS中数组遍历的方法及比较
数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为ios是兼容C语言的,所以c语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系 ...
- jQuery插件实现表格隔行换色且感应鼠标高亮行变色
实现表格隔行换色,且感应鼠标行变色的方法有很多,在本文将为大家介绍的是使用jQuery插件来实现,具体如下 看代码: : css代码: