利用socket从client传输文件指令于server 再返还字节大小与内容
注意:
##client.recv(1024)此句指令尤为重要
--每次收到最大1024 一般都小于1024,
-因此必须判断每次传输的字节大小 并累加 直到保证接收到的内容不小于server发出的内容
-否则一直继续传输
client代码
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()
server代码
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 型才有encode转码,因此其他int/double型需先转成String型
2.send函数只能传输byte型字节,对于ASCII码的字符串 可在前面直接加b进行转码操作 例:b‘ssadads’
但若要将中文字符转ASCII码 必须使用decode解码为unicode (此在day4学python中有详细讲解)
3.字节型用len测量和字符串型不同 即使两边数字都相同 len后的值依旧不同
要比较值时,先字符串型decode解码或字节型转码 方可进行比较