Python socket 文件传输

1.基于TCP的文件传输

服务端:

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--
import socket
sscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sscok.bind(('127.0.0.1',9999,))
sscok.listen(10)
while True:
    conn,addr =sscok.accept()
    recv_size = 0
    #接收文件的大小
    file_size = str(conn.recv(1024),encoding='utf-8')
    file_size_int = int(file_size)
    with open('new.jpg','wb') as f:
        while True:
            if recv_size == file_size_int:
                break
            data = conn.recv(1024)
            f.write(data)
            recv_size += len(data)
sscok.close()

客户端:

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--
import socket
import os
import time
cscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cscok.connect(('127.0.0.1',9999))
#获取文件大小
file_size = os.stat('old.jpg').st_size
#发送文件大小
cscok.sendall(bytes(str(file_size),encoding='utf-8'))
time.sleep(5) #没有成功,让客户端停留
#发送文件内容
with open('old.jpg','rb') as f:
    for line in f:
        cscok.sendall(line)
cscok.close()

上述的实验,有可能不成功,会出现粘包的问题,第一次发送的包和第二次发送的包粘在了一起,被缓冲区一起发送过去了

解决方案,在发送包之间进行一次确认交互即可

服务端:

import socket
sscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sscok.bind(('127.0.0.1',9999,))
sscok.listen(10)
while True:
    conn,addr =sscok.accept()
    recv_size = 0
    file_size = str(conn.recv(1024),encoding='utf-8')
    file_size_int = int(file_size)
    #解决粘包,发送确认消息
    conn.send(bytes('已经收到文件大小',encoding='utf-8'))
    with open('new.jpg','wb') as f:
        while True:
            if recv_size == file_size_int:
                break
            data = conn.recv(1024)
            f.write(data)
            recv_size += len(data)
sscok.close()

客户端:

import socket
import os
import time
cscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cscok.connect(('127.0.0.1',9999))
file_size = os.stat('old.jpg').st_size
cscok.sendall(bytes(str(file_size),encoding='utf-8'))
#解决粘包,接收确认消息
cscok.recv(1024)
with open('old.jpg','rb') as f:
    for line in f:
        cscok.sendall(line)
cscok.close()

 

posted @ 2017-05-04 10:53  1916  阅读(441)  评论(0)    收藏  举报