
注意:
## client.recv(1024)这句话特别重要
-每次接收的最大1024个通常小于1024,
-因此,有必要判断每个传输字节的大小并累积cmd加密文件,直到接收到的内容不少于服务器发送的内容为止

-否则继续发送
客户代码
import socket client=socket.socket() client.connect(('localhost',999)) while True: cmd=input(">>:").strip() if len(cmd)==0: continue client.send(cmd.encode("utf-8")) cmd_res_size=client.recv(1024) #接收命令长度 print("命令长度为",cmd_res_size.decode()) receive_size=0 while receive_size!=int(cmd_res_size.decode()): cmd_res=client.recv(1024) #每次收到最大1024 一般都小于1024,不能用for判断 receive_size+=len(cmd_res.decode()) print(cmd_res.decode()) print("done 打印长度为",receive_size) client.close()
服务器代码

import socket,os server=socket.socket() server.bind(('localhost',999)) server.listen() while True: conn,addr=server.accept() print("new conn",addr) while True: data=conn.recv(1024) if not data: print("用户已断开") break print("执行指令:",data) cmd_res=os.popen(data.decode()).read() if len(cmd_res) == 0: cmd_res = "your input is wrong!" conn.send(str(len(cmd_res)).encode("utf-8")) conn.send(cmd_res.encode("utf-8")) server.close()
补充:
1. 只有String类型具有编码转码cmd加密文件,因此其他int / double类型需要先转换为String类型
2. 发送功能只能传输字节字节. 对于ASCII码字符串,您可以直接在前面加b进行转码操作. 例如: b‘ssadads’

但是,如果要将中文字符转换为ASCII代码,则必须使用编码转码(在第4天学习python的过程中对此进行了详细说明)
3. 字节类型使用len测量,字符串类型不同,即使两边的数字相同,len之后的值仍然不同
要比较值时,可以先进行字符串类型的解码或字节类型的转码,然后再进行比较
*********************************************** ****************************************************** ****************************************************** **************

socketserver的套接字升级版本
import socketserver #对socket进行封装 class MyTCP(socketserver.BaseRequestHandler): #定义处理类,继承于BaseRequestHandler def handle(self): #与所有客户端的交互都在handle里完成 重写此函数 while True: try: self.data=self.request.recv(1024).strip() #接收信息 print(self.client_address[0],"write") #显示用户ip print(self.data) #打印传输数据 if not self.data: self.request.send(self.data.upper()) #返回大写 except ConnectionRefusedError as e: #抓住异常并打印 print("err",e) break HOST,PORT="localhost",999 #初始化 #server=socketserver.TCPServer((HOST,PORT),MyTCP) #单线程 实例化一个server对象 server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCP) #多线程 实例化一个server对象 server.serve_forever() #处理请求 永远执行 server.close()
作为服务器,它可以支持多线程和多方面的客户端请求
=====================================
补充:
传输文件以MD5格式加密
import socket,hashlib client=socket.socket() #实例化socket对象 client.connect(("localhost",999)) #连接 while True: cmd=input(">>:".strip()) #用户输入指令 去空格 if len(cmd)==0:continue #输入为空重新输入 if cmd.startswith("get"): #指令以get开头 client.send(cmd.encode()) #发送命令 server_response=client.recv(1024) #接收server端回复 print("文件大小",server_response.decode()) #打印server端的信息(文件大小) client.send(b"ready......") #回复server端 size=int(server_response.decode()) #文件大小 receive_size=0 #接收信息size累加 filename=cmd.split()[1] #文件名 f=open("lala","wb") #打开文件 m=hashlib.md5() #实例化MD5加密 while receive_size<size: #由于client传输的信息每次传输最大为1024 但实际不到 if(size-receive_size>1024): #因此每次都得累加传输的信息数量与总理做对比 a=1024 else: a=size-receive_size print(a,size,receive_size) data=client.recv(a) #接收client传输的信息 receive_size+=len(data) #累加 m.update(data) #MD5累加数据用update函数 f.write(data) print("file rece done") new_file_md5=m.hexdigest() #16进制数据字符串 f.close() server_file_md5=client.recv(1024) print("server file",server_file_md5) print("client file",new_file_md5) client.close()
可以直接连接到上层套接字服务器
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-263156-1.html
3000多
美国进一海里我们就封死一家沃尔玛和美国的跨国公司
这就是报应