Что я делаю не так с sendline () на моем скрученном сервере? - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь отправить содержимое файла клиенту по одной строке за раз так что клиент (написанный в Objective-C) может обрабатывать каждую строку индивидуально. Однако журнал клиента показывает, что данные отправляются с сервера все проходит через 1 строку и, по-видимому, слишком велик, поэтому он отрезает середину через одну строку, вызывая сбой клиента из-за непредвиденного синтаксиса.

Есть ли что-то, что я делаю на сервере (написано на python с витой), что в результате чего строки не будут отправляться отдельно?

Вот конкретный код на сервере, который поддерживает меня в данный момент.

def sendLine(self, line): 
    self.transport.write(line + '\r\n') 

def updateShiftList(self):

    #open the datesRequested file for the appropriate store and load the dates into a list
    fob = open('stores/'+self.storeName+'/requests/datesRequested','r')
    DATES_REQUESTED = fob.read()
    datesRequested = DATES_REQUESTED.split('\n')
    #open each date file that is listed in datesRequested
    for date in datesRequested:
        if os.path.isfile('stores/'+self.storeName+'/requests/' + date):
            fob2 = open('stores/'+self.storeName+'/requests/' + date,'r')
            #load the file into memory and split the individual requests up
            THE_REQUESTS = fob2.read()
            thedaysRequests = THE_REQUESTS.split('\n')
            for oneRequest in thedaysRequests:
                if len(oneRequest) > 4:
                    print "*)[*_-b4.New_REQUEST:"+oneRequest
                    self.sendLine('*)[*_-b4.New_REQUEST:'+oneRequest)
            fob2.close()
    fob.close()

Так расстраивает, и я уверен, что это легко. Спасибо.

1 Ответ

0 голосов
/ 16 марта 2012

Этот вопрос касается темы, которая часто поднимается.В стеке потока есть несколько вопросов по поводу этой проблемы:

и т. Д.

TCP отправляет заказанный, надежный поток данных.

  • Порядок означает, что отправленные байты первыми прибывают первыми.
  • Надежность означает, что отправленные байты будут доставлены, илисоединение разорвется.Данные не отбрасываются молча.

Потоковая передача - это то, что в основном касается вашего вопроса.Поток не делится на отдельные сообщения.Он состоит из байтов, и «граница» между этими байтами может перемещаться произвольно.

Если вы отправите «привет», а затем отправите «мир», граница между этими двумя строками в потоке может исчезнуть.Пир может получить «привет, мир» или «h», «ello, мир» или «он», «ll», «o», «w», «или», «ld».

Именно поэтому люди используют линейно-ориентированные протоколы."\ R \ n" в конце каждого логического сообщения позволяет буферу получателя и разделить поток на эти исходные логические сообщения.

Для более глубокого погружения я рекомендую это видео недавней презентации PyCon:http://pyvideo.org/speaker/417/glyph

Все это указывает на другой конец вашего соединения, клиента ObjC, как на источник вашего неправильного поведения.

...