使用TCP在局域网内传输文件

Zss 发表于:

在前阵子实现在局域网内使用UDP来传输文件,发现若使用UDP来发送数据,不管这个过程中丢包或者,客户端收报顺序的话,100M的带宽很容易就被占满

基本满载10MB/s,但是到最后传输的文件视频会发生错误,我猜测是传输过程中数据包的组装顺序一致所导致的,这次使用TCP再次测试一下,发现当TCP传输的数据大小设置为

与UDP一致的1472时,传输速度非常慢只有0.5MB/s,因为TCP本来就保证传输数据的准确和可靠,所以最后发现将每个数据包的大小设置为60000时,速度也可以将其占满,

达到10MB/s,且当数据分片的时候,由于TCP的可靠机制,数据的传输不会发生错误且能够达到最大速度

理论上来说:UDP的传输速度比TCP的传输速度快

TCP会帮你处理丢包重发问题,包乱序问题,所以是可靠传输,UDP不会处理这些问题,得自己在应用层自己编写类似于TCP的可靠传输机制

服务端:

#coding:utf-8
from socket import *


def burst_data():
    file_b = []
    size = 60000
    with open('111.mp4','rb+') as f:
        data = f.read()
    index = int((len(data)/(float(size))))
    for i in range(0,index+1):
        file_b.append(data[int(size)*i:int(size)*(i+1)])
    return file_b

if __name__ == '__main__':
    data_list = burst_data()
    server = ('192.168.16.104',6666)
    tcp_socket = socket(AF_INET,SOCK_STREAM)
    tcp_socket.bind(server)
    tcp_socket.listen(5)
    connet,ip_port = tcp_socket.accept()
    print 'from by',ip_port
    a = len(data_list)
    v = 1
    for i in data_list:
        print('正在传输数据块:%d   总共为:%d'%(v,a))
        connet.send(i)
        v += 1

客户端:

from socket import *


server = ('192.168.16.104',6666)
tcp_socket = socket(AF_INET,SOCK_STREAM)
tcp_socket.connect(server)

tcp_socket.send('hello')
while 1:
    data = tcp_socket.recv(60000)
    with open('112.mp4','ab+') as f:
        f.write(data)