2016-09-11 3 views
0

Как перенести большой файл (видео, аудио) с моего клиента на сервер на локальном хосте с использованием сокетов UDP в python 3.5? Мне удалось отправить небольшой файл .txt, но не другие типы файлов. Пожалуйста, дайте мне советы. Спасибо!Передача файлов сокетов UDP python 3.5

Вот мой код для передачи текстового файла.

КЛИЕНТ КОД:

import socket 
import sys 

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

host = '127.0.0.1' 
port=6000 

msg="Trial msg" 

msg=msg.encode('utf-8') 

while 1: 

    s.sendto(msg,(host,port)) 
    data, servaddr = s.recvfrom(1024) 
    data=data.decode('utf-8') 
    print("Server reply:", data) 
    break 
s.settimeout(5) 

filehandle=open("testing.txt","rb") 

finalmsg=filehandle.read(1024) 

s.sendto(finalmsg, (host,port)) 

SERVER КОД:

import socket 

host='127.0.0.1' 

port=6000 

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

s.bind(("",port)) 

print("waiting on port:", port) 

while 1: 

    data, clientaddr= s.recvfrom(1024) 
    data=data.decode('utf-8') 
    print(data) 
    s.settimeout(4) 
    break 

reply="Got it thanks!" 

reply=reply.encode('utf-8') 

s.sendto(reply,clientaddr) 

clientmsg, clientaddr=s.recvfrom(1024) 
+0

Вы можете показать нам свой код? –

+0

Конечно. Я добавил его к своему оригинальному сообщению – Rohan

+0

Поскольку UDP - ненадежный протокол, вам нужно добавить к нему некоторый уровень надежности. Это не тривиальная задача и добавление всего этого в ваш тривиальный пример кода, который просто управляет отправкой/получением одного пакета, делает этот вопрос слишком широким. Но вы можете начать с использования нескольких отправки и получения для передачи большего количества данных. Помимо этого, пожалуйста, узнайте, как использовать правильное форматирование кода при задании вопросов в SO. –

ответ

0

Не использовать UDP для передачи больших файлов, использование TCP.

UDP не передает все отправленные вами пакеты, или если они прибудут в порядок, они могут быть даже дублированы. Кроме того, UDP не подходит для больших передач, потому что 1) он не имеет контроля перегрузки, поэтому вы просто наводняете сеть, и пакеты будут удалены, и 2) вам придется разбить свои пакеты на более мелкие, обычно около 1400 байт рекомендуется хранить в MTU иначе, если вы полагаетесь на фрагментацию IP, и один фрагмент потерян, весь ваш файл потерян. Вам нужно будет написать собственный код, чтобы исправить все эти проблемы с помощью UDP, поскольку передача файлов требует, чтобы все было надежно отправлено.

TCP, с другой стороны, уже делает все это, он надежен, имеет управление перегрузкой и вездесущ - вы просматриваете эту веб-страницу через HTTP, которая находится поверх TCP.

+0

Это не отвечает на вопрос, как это сделать с UDP. UDP можно использовать для передачи больших файлов и используется для передачи больших файлов, хотя необходимо добавить механизм надежности, аналогичный TCP поверх UDP (например, в [QUIC protocol] (https://en.wikipedia.org/ wiki/QUIC)) или принять потенциальную потерю данных (например, в потоковой видео в реальном времени). –

+0

Ya, но я должен делать это с помощью UDP, поэтому мне было интересно, как я мог это сделать. – Rohan

+0

Я знаю, что UDP можно использовать, но, судя по OP (начиная с нуля и переносить существующие большие файлы, т.е. не жить потоковым), было бы безумно глупо писать собственный протокол, и я согласен с ответом. Серьезно, вернитесь к тому, кто санкционирует UDP, и объясните, что 6 месяцев разрабатывают собственный протокол, чтобы сделать что-то хуже, чем TCP-файл, просто не стоит этого. – markmnl

 Смежные вопросы

  • Нет связанных вопросов^_^