Python_08_20200224
变更履历
日期 | 版本 | 内容 | 作者 | 备注 |
---|---|---|---|---|
2020/02/24 | v1.00 | 初版做成 | author | 仿佛自己失业了 |
socket
- 客户端和服务器通信(encode,decode,缓冲区)
- 客户端发命令给服务器端(双向通信,大数据)
- 客户端发文件给服务器端(md5加密,双向通信,文件读写)
粘包处理
通信时,两条发送的内容在一起,导致收到的数据错误
1.第一条发送后,等另一端相应,再发
2.接受数据的长度是动态的
socketServer
封装底层的Server
import socketserver
import json
import os
class MyTCPHandle(socketserver.BaseRequestHandler):
def upload(self,*args):
cmd_js=args[0]
filename=cmd_js["filename"]
filesize=cmd_js["filesize"]
if os.path.isfile(filename):
f=open(filename+".new","wb")
else:
f=open(filename,"wb")
self.request.send(b"200")
received_size=0
while received_size<filesize:
data=self.request.recv(1024)
f.write(data)
received_size+=len(data)
else:
print("filename %s has uploaded" %filename)
def handle(self):
while True:
try:
self.data=self.request.recv(1024).strip()
print("{} wrote:" .format(self.client_address[0]))
print(self.data)
cmd_js=json.loads(self.data.decode())
action=cmd_js["action"]
if hasattr(self,action):
func=getattr(self,action)
func(cmd_js)
except ConnectionResetError as e:
print("client is disconnect...")
break
if __name__ =="__main__":
HOST,PORT="localhost",9999
#启用线程
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandle)
#ForkingTCPServer 进程
server.serve_forever()
客户端
# -*- coding:utf-8 -*-
import socket
import os
import json
class FTPClient(object):
def __init__(self):
self.client=socket.socket()
def connect(self,ip,port):
self.client.connect((ip,port))
def download(self):
pass
def upload(self,*args):
cmd_split=args[0].split()
if len(cmd_split)>1:
filename=cmd_split[1]
if os.path.isfile(filename):
filesize=os.stat(filename).st_size
msg={
"action": "upload",
"filename":filename,
"filesize":filesize,
"overriden":True
}
self.client.send(json.dumps(msg).encode("utf-8"))
server_request=self.client.recv(1024)
f=open(filename,"rb")
for line in f:
self.client.send(line)
else:
print("%s is upload success"%filename)
f.close()
else:
print(filename,"is not exist")
def cmd(self):
pass
def send(self):
while True:
cmd=input("send:").strip()
if len(cmd) ==0: continue
cmd_str =cmd.split()[0]
if hasattr(self,"%s" %cmd_str):
func=getattr(self,"%s" %cmd_str)
func(cmd)
def colse(self):
self.client.close()
ftp=FTPClient()
ftp.connect("localhost",9999)
ftp.send()