Уведомления

Группа в Telegram: @pythonsu

#1 Июль 3, 2014 15:28:56

d54wvzc+i5zirs
Зарегистрирован: 2014-05-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отследить окончание передачи данных

Сейчас немного закомился с сокетами, пробовал писать простейшие http серверы. У меня вот возник небольшой вопрос, как можно отследить, что данные переданы полностью? Когда нужно прекращать читать с сокета и закрывать его?

Офлайн

#2 Июль 3, 2014 16:57:20

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Как отследить окончание передачи данных

А может сначала документацию почитать?! перед тем как спрашивать



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Июль 3, 2014 19:33:51

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Как отследить окончание передачи данных

Пустая строка говорит о том, что данные переданы

 # -*- coding: utf-8 -*-
import socket
def retrieve(url, path):
    host,url=url.split('//',1)[-1].split('/',1)
    client=socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0, None)
    client.connect((socket.gethostbyname(host), 80))
    print('ok connect')
    client.send('GET /%s HTTP/1.0\r\nHost: %s\r\nUser-agent: Mozila\r\n\r\n' % (url, host))
    string=client.recv(1024).split('\r\n')
    for t in range(len(string)):
        if not string[t] or string[t].isspace():
            break
    print('\r\n'.join(string[:t+1])) # Header
    string = ['\r\n'.join(string[t+1:])]
    while True:
        part = client.recv(1024)
        if not part:
            break
        string.append(part)
    open(path, 'w').write(''.join(string))
    print('Done')
  
if __name__=='__main__':
    retrieve('http://python.su/media/blog/images/devconf.png', '/sdcard/python.png')
    

Офлайн

#4 Июль 3, 2014 23:17:15

d54wvzc+i5zirs
Зарегистрирован: 2014-05-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отследить окончание передачи данных

dimy44
Пустая строка говорит о том, что данные переданы
У меня не возвращается пустая строка при окончании передачи, просто выполнение останавливается на получении данных conn.recv(1024).
Почему так происходит?

Офлайн

#5 Июль 4, 2014 07:28:15

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Как отследить окончание передачи данных

Код в студию

Офлайн

#6 Июль 4, 2014 07:37:01

d54wvzc+i5zirs
Зарегистрирован: 2014-05-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отследить окончание передачи данных

import socket
HOST = '' 
PORT = 8080
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, PORT))
while True:
    print(u"Слушаю порт {}".format(PORT))
    srv.listen(1)
    sock, addr = srv.accept()
    while True:
        pal = sock.recv(1024)
        if not pal:
            break
        print(u"Получено от {}: {}:".format(addr, pal.decode('utf8')))
    sock.send(pal)
    sock.close()

Офлайн

#7 Июль 4, 2014 08:46:12

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Как отследить окончание передачи данных

Вы скопировали код сервера из книги, вы запустили и ждете? Он слушает порт, и будет вечно слушать, пока не получит данные от клиента.

Офлайн

#8 Июль 4, 2014 09:09:22

d54wvzc+i5zirs
Зарегистрирован: 2014-05-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отследить окончание передачи данных

Ну просто на сколько я понял, он должен принять данные, после того как все принял он принимает пустую строку и после этого заканчивается вложенный цикл приёма данных и пользователю отправляется ответ.
А получается так, что сервер начинает до бесконечности слушать сокет (потому что клиент не закрыл соединение.)

Офлайн

#9 Июль 4, 2014 23:13:47

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Как отследить окончание передачи данных

Ага, щас воссоздал на планшете такую ситуацию, вот что получилось

 # -*- coding: utf-8 -*-
# python 2.6.2
import socket
import threading
import time
    
HOST = ''
PORT = 8080
def server():
    srv = socket . socket(socket .AF_INET, socket . SOCK_STREAM)
    srv. setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR , 1)
    srv .bind((HOST, PORT))
    srv.listen(1)
    sock, addr = srv.accept()
    s = ''
    while True:
        pal = sock.recv(1024)
        s += pal
        if not pal:
            break
    print ('Я сервер, получил от {0}: {1}' . format(addr, s))
    sock.send(s.upper())
    sock.close()
    
th =threading.Thread(None, server, '', ())
th.start()
time.sleep(1)
    
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', PORT))
sock.send('qwertyuiasdfghjk')
sock.shutdown(socket.SHUT_WR)
result = sock.recv(1024)
sock.close()
print('Я клиент, получил ответ: {0}'.format(result))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version