python基础--socket套接字、粘包问题
本地回环地址:127.0.0.1
简易版服务端:
import socket
server = socket.socket() # 就比如买了一个手机
server.bind(("127.0.0.1",8080)) # bind中绑定的是IP地址和端口号,注意是一个元组,就比如,将手机卡,插入了手机
server.listen(5) # 半连接池,最大等待连接数为5个,就比如开机
conn,address = server.accept() # 接听电话等着别人给你打电话
date = conn.recv(1024) # 听别人说话,接收1023个字节数
print(date)
conn.send(b"hello") # 给别人回话
conn.close() # 挂断电话
server.close() # 关机
简易版客户端:
import socket
client = socket.socket() #拿电话
client.connect(("127.0.0.1",8080)) #绑定的是IP地址和端口号,也是一个元组 拨号
client.send(b"hello") # 对别人发消息
date = client.recv(1024) #接收别人说话,没次接收1024个字节
print(date)
client.close() # 挂电话
注意:在写服务端和客户端的时候send和recv需要一一对应,不能再两边都出现,recv是跟内存要数据,至于数据的来源无需考虑
粘包:
服务端:
import socket
server = socket.socket() # 就比如买了一个手机
server.bind(("127.0.0.1",8088)) # bind中绑定的是IP地址和端口号,注意是一个元组,就比如,将手机卡,插入了手机
server.listen(5) # 半连接池,最大等待连接数为5个,就比如开机
conn,address = server.accept() # 接听电话等着别人给你打电话
date = conn.recv(1024) # 听别人说话,接收1023个字节数
print(date)
date = conn.recv(1024) # 听别人说话,接收1023个字节数
print(date)
conn.close() # 挂断电话
server.close() # 关机
客户端:
import socket
client = socket.socket() #拿电话
client.connect(("127.0.0.1",8088)) #绑定的是IP地址和端口号,也是一个元组 拨号
client.send(b"hello") # 对别人发消息
client.send(b"hello") # 对别人发消息
client.close() # 挂电话
服务端打印结果:
b'hellohello'
这是因为tcp协议会将时间间隔短的,和文件大小小的会一次打包发送给对方
解决粘包问题:
struct模块:
import struct
print("--------------------------1--------------------------")
msg = "asdasdasdasdasd"
print("原字符串的长度")
print(len(msg))
handler = struct.pack("i",len(msg))
print("创建报头的长度")
print(len(handler))
res = struct.unpack("i",handler)[0]
print("解报头过后的长度")
print(res)
print("--------------------------2--------------------------")
msg1 = "asdasdasdasdasdasdasdasd"
print("原字符串的长度")
print(len(msg1))
handler1 = struct.pack("i",len(msg1))
print("创建报头的长度")
print(len(handler1))
res1 = struct.unpack("i",handler1)[0]
print("解报头过后的长度")
print(res1)
"""
--------------------------1--------------------------
原字符串的长度
15
创建报头的长度
4
解报头过后的长度
15
--------------------------2--------------------------
原字符串的长度
24
创建报头的长度
4
解报头过后的长度
24
"""
我们可以将报头发过去,然后解报头,就可以知道原来数据的大小,如果这个字节大小比我们接受的大,我们就可以一直让它接收,直到接收完成为止,
服务端:
import json
import os
import socket
import struct server_path = r'/Users/mac/Documents/client-server/server_movie' server = socket.socket() ip_port = ('127.0.0.1', 8080) server.bind(ip_port) server.listen(5) conn, addr = server.accept()
while 1: head_len = conn.recv(4) head_len = struct.unpack('i', head_len)[0] json_head = conn.recv(head_len).decode('utf-8') head = json.loads(json_head) file_size = head['file_size'] with open(os.path.join(server_path, head['file_name']), 'wb') as f:
while file_size:
if file_size >= 1024:
content = conn.recv(1024)
f.write(content)
file_size -= 1024
else:
content = conn.recv(file_size)
f.write(content)
break
客户端:
import os
import socket
import json
import struct client = socket.socket() ip_port = ('127.0.0.1', 8080) client.connect(ip_port) head = {
'file_path': r'/Users/mac/Documents/client-server/client_movie',
'file_name': None,
'file_size': None
}
movie_list = os.listdir(head['file_path']) while 1:
for i, m in enumerate(movie_list, 1):
print('%s --> %s' % (i, m))
choice = input('please input movie number:>>').strip()
if choice.isdigit():
choice = int(choice)
if choice in range(1, len(movie_list) + 1):
movie_name = movie_list[choice - 1]
head['file_name'] = movie_name
head['file_size'] = os.path.getsize(os.path.join(head['file_path'], head['file_name']))
json_head = json.dumps(head).encode('utf-8')
bytes_head = len(json_head)
pack_head = struct.pack('i', bytes_head)
client.send(pack_head)
client.send(json_head)
file_size = head['file_size']
with open(os.path.join(head['file_path'], head['file_name']), 'rb') as f:
while file_size:
if file_size >= 1024:
content = f.read(1024)
client.send(content)
file_size -= 1024
else:
content = f.read(file_size)
client.send(content)
print("finish")
break
else:
print('index out of range')
else:
print('input number...')
python基础--socket套接字、粘包问题的更多相关文章
- Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.
Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: 专业理解: socket是应用层与TCP/IP ...
- python 29 Socket - 套接字
目录 Socket - 套接字 Socket - 套接字 应用层与TCP/IP协议族通信层(或传输层)之间的抽象层,是一组接口()接收数据:当接口接收数据之后,交由操作系统: 如果数据与操作系统直接交 ...
- python开发socket套接字:粘包问题&udp套接字&socketserver
一,发生粘包 服务器端 from socket import * phone=socket(AF_INET,SOCK_STREAM) #套接字 phone.setsockopt(SOL_SOCKET, ...
- 全网最详细python中socket套接字send与sendall的区别
将数据发送到套接字. 套接字必须连接到远程套接字. 返回发送的字节数. 应用程序负责检查是否已发送所有数据; 如果仅传输了一些数据, 则应用程序需要尝试传递剩余数据.(需要用户自己完成) 将数据发送 ...
- python开发socket套接字:套接字&通信循环&链接循环&模拟远程命令
一,套接字 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket ...
- tcp套接字粘包解决办法
粘包只会出现在tcp,udp传输不会产生粘包现象.解决粘包的原理就是服务器预先向客户端发送客户端即将获取文件的大小. 第一版解决方案: 服务器: # Author : Kelvin # Date : ...
- python TCP socket套接字编程以及注意事项
TCPServer.py #coding:utf-8 import socket #s 等待链接 #c 实时通讯 s = socket.socket(socket.AF_INET,socket.SOC ...
- python基础--基于套接字进行文件传输、异常处理、socketserver模块
异常处理: 什么是异常处理: 程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来,造成的影响就是整个程序无法再正常运行 异常的结构: 异常的类型.异常的信 ...
- Python开发基础-Day23try异常处理、socket套接字基础1
异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...
随机推荐
- 基于 RocketMQ 的同城双活架构在美菜网的挑战与实践
本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践. 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调 ...
- 常见的HTTP状态码详细解析
http状态码分为五类 : 1XX 信息 服务器收到请求,需要请求者继续操作 2XX 成功 请求被成功接手并返回给请求者 3XX 重定向 需要进一步操作才能完成请求 4XX 客户端错误 请求包含语法错 ...
- CCPC-Wannafly Summer Camp 2019 全记录
// 7.19-7.29 东北大学秦皇岛校区十天训练营,题目都挂在了Vjudge上.训练期间比较忙,没空更博总结,回来继续补题消化. Day1 这天授课主题是简单图论,节奏挺好,wls两小时理完图论里 ...
- java多线程编程建议
多线程编程建议 1,将应用设计成支持多线程并发,可提高性能 2,编写多线程程序,首先保证它是正确的,其次再考虑性能 3,同步处理的开销大于非同步处理,如果可能,尽量使用非同步处理 4,避免多个共享变量 ...
- Activiti流程定义语言
1.流程(process) bpmn文件一个流程的根元素.一个流程就代表一个工作流. 2.顺序流(sequenceFlow) 顺序流是连接两个流程节点的连线,代表一个节点的出口.流程执行完一个节点后, ...
- spark生态圈简介
原文引自:http://www.cnblogs.com/shishanyuan/p/4700615.html 1.简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algori ...
- 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念
数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...
- 初识css3 3d动画效果
(先看我博客右上角的3d盒子动画效果,目前没做兼容处理,最好最新的chrome看)无意间看到网上css3写的3d动画效果,实在炫酷,以前理解为需要js去计算去写,没想到css直接可以实现.于是开始研究 ...
- 【codeforces 508D】Tanya and Password
[题目链接]:http://codeforces.com/problemset/problem/508/D [题意] 给你一个字符的所有连续3个的子串; 让你复原出原串; (包含小写.大写字母以及数字 ...
- 关于MySQL IN LIKE OR使用索引的问题
以前在网上看了一些资料,有些人说话不严谨,导致一直被误导,最近在实际开发中发现一些结论有问题,因此特地整理了一下,防止下次继续犯错. 以下前提是有对这个字段建立索引(简直废话,没建的肯定不会使用索引啊 ...