Форум сайта python.su
0
Сейчас немного закомился с сокетами, пробовал писать простейшие http серверы. У меня вот возник небольшой вопрос, как можно отследить, что данные переданы полностью? Когда нужно прекращать читать с сокета и закрывать его?
Офлайн
103
А может сначала документацию почитать?! перед тем как спрашивать
Офлайн
Пустая строка говорит о том, что данные переданы
# -*- 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')
Офлайн
0
dimy44У меня не возвращается пустая строка при окончании передачи, просто выполнение останавливается на получении данных conn.recv(1024).
Пустая строка говорит о том, что данные переданы
Офлайн
0
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()
Офлайн
Вы скопировали код сервера из книги, вы запустили и ждете? Он слушает порт, и будет вечно слушать, пока не получит данные от клиента.
Офлайн
0
Ну просто на сколько я понял, он должен принять данные, после того как все принял он принимает пустую строку и после этого заканчивается вложенный цикл приёма данных и пользователю отправляется ответ.
А получается так, что сервер начинает до бесконечности слушать сокет (потому что клиент не закрыл соединение.)
Офлайн
Ага, щас воссоздал на планшете такую ситуацию, вот что получилось
# -*- 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))
Офлайн