2010-05-26 7 views
2

У меня возникла проблема с отправкой данных в виде файла с одного конца сокета на другой. Что происходит, так это то, что и сервер, и клиент пытаются прочитать файл, чтобы файл никогда не отправлялся. Мне было интересно, как сделать клиентский блок до тех пор, пока сервер не завершит чтение файла, отправленного с клиента.Отправка файла через сокет

я это работает с сырыми пакетами с помощью отправки и RECV, но понял, что это было чистое решение ...

Клиент:

  1. подключается к серверу создания сокет-соединения
  2. создает файл на сокете и отправляет данные
  3. ждет файла с сервера

Сервер:

  1. ждет файла от клиента

Полная interraction:

  1. клиент отправляет данные на сервер
  2. сервер отправляет данные клиента

Редактировать

код на самом деле я смотрел на был размещен в этом вопросе, но я думаю, что материал Eventlet пугали людей ... https://stackoverflow.com/questions/2909358/eventlet-client-server

Под его только с помощью сокетов Python, так что я понял, я «d упрощать вопрос и спросить только об основной проблеме сокета ...

+0

сообщение некоторый код пожалуйста? –

ответ

1

Я не уверен, что вопрос ясен, вы спрашиваете:

  1. Как таковой nd всей информации о файле в соке?
  2. Как заставить писателя блокировать запись некоторых данных?
  3. Что-то еще совсем?

Если вопрос №1, вам нужно открыть файл и проанализировать его в потоке байтов, а затем передать весь набор байтов в одном вызове «write».

Если вопрос №2 означает, что вы хотите, чтобы писатель подождал, пока читатель полностью не прочитает байты (и не обработает их?), Прежде чем двигаться дальше, вам необходимо, чтобы читатель и писатель координировали. Это можно сделать, если после написания сценария сценарий «читать» (чтение является блокирующим). Затем, после того, как читатель закончил читать (и обрабатывает байты), попросите его написать что-нибудь писателю, чтобы разбудить его.

Если вопрос № 3, возможно, вы можете предоставить более подробную информацию.

+0

Второй вариант. По какой-то причине то, что вы описываете, это то, что я делаю, и оно не работает. Координирование чтения - это то, что я пытаюсь выяснить ... – johannix

3

Похоже, у вас есть клиент, посылающий файл, а затем ждет ответа от сервера, но если вы не даете серверу признак того, что он полностью прочитать файл, ПРИЕМ() на серверная сторона будет в ожидании большего количества данных. Вы можете вызвать shutdown (SHUT_WR) на стороне клиента, как только клиент будет отправлен. Это сообщает серверу, что после того, как он прочитал все отправленные данные, их больше нет.

Очень простой пример (отправка одного блоб данных на сервер и получать блоб один данных в ответ):

сервер

>>> from socket import * 
>>> s=socket() 
>>> s.bind(('',8000)) 
>>> s.listen(1) 
>>> c,a = s.accept() # will hang here until a client connects 
>>> recvd='' 
>>> while True: 
... data = c.recv(1024) 
... if not data: break # recv() will return '' only if the client calls shutdown(SHUT_WR) or close() 
... recvd += data 
... 
>>> recvd 
'a message' 
>>> c.sendall('a response') 
>>> c.close() # done with client, could loop back to accept here 
>>> s.close() # done with server 

клиент

>>> from socket import * 
>>> s=socket() 
>>> s.connect(('localhost',8000)) 
>>> s.sendall('a message') 
>>> s.shutdown(SHUT_WR) # tells server you're done sending, so recv won't wait for more 
>>> recvd='' 
>>> while True: 
... data = s.recv(1024) 
... if not data: break 
... recvd += data 
... 
>>> recvd 
'a response' 
>>> s.close() 
Смежные вопросы