一.socket网络编程

粘包:服务端两次发送指令在一起,它会把两次发送内容合在一起发送,称为粘包,从而出现错误。

解决方法:(比较low的方法)

有些需要实时更新的,用sleep有延迟,不能这样解决问题。

解决方法之高级方法:

客户端:

二.发送文件

ftp server端有哪几步呢?

①读取客户端发过来的文件名

②检测文件是否存在

③打开文件

④检测文件大小

⑤发送文件大小给客户端

⑥等待客户端确认

⑦开始边读边发数据

⑧发送md5

 import socket
import os
import time
import hashlib
server = socket.socket()
server.bind(('localhost',3333)) server.listen() while True:
conn,addr = server.accept()
print("new conn:",addr)
while True:
print("等待新指令")
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
cmd,filename = data.decode().split()
print(filename)
if os.path.isfile(filename):
f = open(filename,"rb")
m = hashlib.md5()
file_size = os.stat(filename).st_size #在os模块中获取文件大小
conn.send(str(file_size).encode()) #发送文件大小
conn.recv(1024) #wait for ack
for line in f:
m.update(line)
conn.send(line)
print("file md5",m.hexdigest())
f.close()
conn.send(m.hexdigest().encode()) #send md5 print("执行指令:", data) server.close()

客户端:

 import socket
import hashlib
client = socket.socket()
client.connect(('localhost',3333)) while True:
cmd = input(">>:").strip() #cmd = input(b">>:").strip()如果前面直接加b,则只能传英文
if len(cmd) == 0 : continue
if cmd.startswith("get"):
client.send(cmd.encode())
server_response = client.recv(1024)
print("server response:",server_response)
client.send("ready to recv file".encode())
file_total_size = int(server_response.decode())
received_size = 0
filename = cmd.split()[1]
f = open("wenjian","wb")
m = hashlib.md5() while received_size<file_total_size:
#下面这段代码彻底解决粘包问题
if file_total_size - received_size > 1024: #要收不止一次
size = 1024
else:
size = file_total_size - received_size #最后一次了,剩多少收多少
print("last receive:",size) data = client.recv(1024)
received_size += len(data)
m.update(data)
f.write(data)
print(file_total_size,received_size) #看演示效果
else:
new_file_md5 = m.hexdigest()
print("file received done",received_size,file_total_size)
f.close()
server_file_md5 = client.recv(1024)
print("server file md5:",server_file_md5)
print("client file md5:", new_file_md5) client.close()

具体用的时候在钻研吧。

最新文章

  1. 查看centos版本号
  2. Notes of the scrum meeting(12.5)
  3. BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)
  4. 居然还有WM_TIMECHANGE(只在用户手动改变系统时间时才会产生作用)
  5. shell脚本中每次读取文件的一行
  6. 2333: [SCOI2011]棘手的操作[写不出来]
  7. RUP 方法简介
  8. MySQL打包执行SQL
  9. 【转载】IIS出现“HTTP 错误 500.0,C:\php\php-cgi.exe - FastCGI 进程意外退出”解决方法
  10. 【003:使用SW4STM32不进入中断的原因】
  11. 数据库SQL优化大总结1之- 百万级数据库优化方案
  12. 如何在 Mac上 安裝 .NET Core 2.1 ?
  13. 一个真实的Async/Await示例
  14. pthread_create()
  15. 学习promise
  16. Selenium Web 自动化 - Selenium常用API
  17. 使用tableau去将存入mysql都地区点击率进行了展示 感觉很好用
  18. ThreadLocal MDC
  19. HTML标签嵌套规则
  20. Python Web学习笔记之Python多线程和多进程、协程入门

热门文章

  1. Validation failed for query for method
  2. java程序员面试交流项目经验
  3. _quest_mod
  4. guxh的python笔记四:迭代
  5. python自动化测试入门篇-postman
  6. python的闭包与延时绑定问题
  7. REACT map dictionary
  8. poj 3254Corn Fields (入门状压dp)
  9. ORA-01034 报错
  10. CSS Basic Memo