Python勉強_08

Python_08_20200224


变更履历

日期版本内容作者备注
2020/02/24v1.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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值