Потоковая передача данных через сокеты - PullRequest
0 голосов
/ 18 июня 2020

Это будет немного необычный пост, так как у меня нет проблем, все работает отлично, но понимаю ли я это - НЕТ!

У меня есть стандартная настройка подключения к сокету et c и потоки данных проходят без проблем:

while True:
    msg = sock_net.recv(100)
    """ Do something with the data"""
    msg = ''

Но это работает независимо от того, что я делаю с размером буфера .recv. Если я распечатаю «msg», оно будет размером с установленный мной буфер - хорошо, это поток данных - но он усекает данные, и следующее «msg» не является продолжением, например:

b '$ WIMWD, 218.5, T, 219.0, M, 10.6, N, 5.5, M * 69 \ r \ n $ WIMWV, 217.0, R, 10.6, N, A * 10 \ r \ n $ WIMWV, 217.0, T, 10.6, N, A * 16 \ r \ n $ IIH 'b' $ SDDPT, 3.7 ,, * 51 \ r \ n $ IIHDG, 1.7 ,,, 0.4, W * 32 \ r \ n $ SDMTW ,, C* 1A \ r \ n $ SDVLW ,, N, 805.2, N, 936.4, N, 936.4, N * 7B \ r \ n $ SDVHW, 1 '

Тем не менее, у меня есть очень конкретный c код чтобы проанализировать поток данных, чтобы получить то, что мне нужно, поэтому в течение while l oop я делаю следующее:

sentences = str(msg)[2:-1].replace("\\r\\n", "").split("$")
sentences = [string for string in sentences if string != ""]

for sentence in sentences:
    sentence = '$' + sentence
    nmea = sentence.split(",") 

And HEAVEN; Я получаю именно то, что мне нужно (я не буду go объяснять, почему я не использовал msg.decode ("utf-8"), но это не дало мне того, что я хотел), но я получаю, например: [ '$ WIMWD, 218.5, T, 219.0, M, 10.6, N, 5.5, M * 69'] ... т.е. непрерывный поток предложений NMEA 0183 для обработки. Что еще более любопытно, мне даже не нужно добавлять данные в переменную, содержащую полученную дату, в соответствии с примерами, которые я видел:

while True:
    msg = sock_net.recv(100)
    full_msg += msg.decode("utf-8")
    """ Do something """
    full_msg = ''

Итак, в чем моя проблема? Я просто не понимаю, что происходит. Что именно здесь делает буфер? Что происходит с данными, передаваемыми за пределы размера буфера, кажется, не имеет значения, какой размер я его установил, он все еще работает ?: Я просто обрабатываю данные в буфере? И так далее. Я ожидал дискретных пакетов информации или, по крайней мере, чего-то, что укажет Python, когда выполнять l oop.

Это очень умно. Я получаю нужные данные с нужной скоростью, но ... кто-нибудь ... что на самом деле происходит?

...