Socket_SSH-2(大文件的一次传输)

import socket,os
server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr=server.accept()
    print("new conn:",addr)
    while True:
        data=conn.recv(1024)
        if not data:
            print("客户端已断,请重新输入")
            break
        cmd_res=os.popen(data.decode('utf-8')).read()
        if len(cmd_res)==0:
            cmd_res='无效命令,没有返回值'
        conn.send(cmd_res.encode('utf-8'))

server.close()

 

import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
    cmd=input(">>:").strip()
    if len(cmd)==0:
        continue
    client.send(cmd.encode('utf-8'))
    cmd_res=client.recv(1024)
    print(cmd_res.decode('utf-8'))
client.close()

 

服务器端的输出

new conn: ('127.0.0.1', 61966)
'pwd' is not recognized as an internal or external command,
operable program or batch file.

 

客户端的输出

>>:pwd
无效命令,没有返回值
>>:dir
 Volume in drive C is OSDisk
 Volume Serial Number is 002E-D604

 Directory of C:\abccdxddd\Oldboy\Py_Exercise\Day8

08/07/2017  03:54 PM    <DIR>          .
08/07/2017  03:54 PM    <DIR>          ..
08/07/2017  03:52 PM               280 client_ch.py
08/07/2017  03:54 PM               509 server_ch.py
08/03/2017  11:17 AM               650 socket_ssh_server.py
08/03/2017  11:26 AM               259 sock_ssh_client.py
08/03/2017  03:56 PM               133 ssh_client.py
08/03/2017  03:54 PM               415 ssh_server.py
08/03/2017  04:55 PM               259 ????.py
08/07/2017  10:27 AM               146 ????.py
               8 File(s)          2,651 bytes
               2 Dir(s)  145,735,159,808 bytes free

让超过1024大小的数据的一次返回,先在服务器端计算大小,把需要接受的次数传给客户端。

服务器端:

import socket,os

server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr=server.accept()
    print("new connection is :",addr)
    while True:
        data=conn.recv(1024)
        if not data:
            print("客户端已经断开")
            break
        cmd_res=os.popen(data.decode('utf-8')).read()
        if len(cmd_res)==0:
            cmd_res="命令无效,没有返回值"
        conn.send(str(len(cmd_res)).encode('utf-8'))
        #整数不能直接encode,需要先转成字符串,再encode.发大小给客户端
        conn.send(cmd_res.encode('utf-8'))
server.close()

 客户端:

import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
    cmd=input(">>:").strip()
    if len(cmd)==0:
        break
    client.send(cmd.encode('utf-8'))
    cmd_res_size=client.recv(1024) #接收命令结果的长度。
    print("命令结果大小:",cmd_res_size)
    received_size=0
    received_data=b""
    while received_size<int(cmd_res_size.decode("utf-8")):
        data=client.recv(1024)
        received_size=received_size+len(data) #每次收到的有效数字,有可能小于1024
        received_data=received_data+data
    else:
        print("cmd res received done...",received_size)
        print(received_data.decode('utf-8'))
client.close()

 

实现收到的数据大小跟要传输的数据大小相一致。

 

import socket,os

server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr=server.accept()
    print("new connection is :",addr)
    while True:
        data=conn.recv(1024)
        if not data:
            print("客户端已经断开")
            break
        cmd_res=os.popen(data.decode('utf-8')).read()
        if len(cmd_res)==0:
            cmd_res="命令无效,没有返回值"
        conn.send(str(len(cmd_res.encode())).encode('utf-8'))
        #整数不能直接encode,需要先转成字符串,再encode.发大小给客户端
        conn.send(cmd_res.encode('utf-8'))
server.close()

 客户端:

import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
    cmd=input(">>:").strip()
    if len(cmd)==0:
        break
    client.send(cmd.encode('utf-8'))
    cmd_res_size=client.recv(1024) #接收命令结果的长度。
    print("命令结果大小:",cmd_res_size)
    received_size=0
    received_data=b""
    while received_size<int(cmd_res_size.decode("utf-8")):
        data=client.recv(1024)
        received_size=received_size+len(data) #每次收到的有效数字,有可能小于1024
        received_data=received_data+data
    else:
        print("cmd res received done...",received_size)
        print(received_data.decode('utf-8'))
client.close()

 关于字符长度:

aa="人"
print(len(aa))
print(len(aa.encode('utf-8')))

 结果输出:

1
3

 

posted on 2017-08-07 17:40  momo8238  阅读(188)  评论(0编辑  收藏  举报