day10学python

利用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解码或字节型转码 方可进行比较

猜你喜欢

转载自www.cnblogs.com/cc123nice/p/10556137.html
今日推荐