Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2018 21:04:26

Tony_bonelli
Зарегистрирован: 2018-08-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать Tcp клиент + работа с txt

Добрый день!
Помогите решить задачу. Имеется сервер, работает по tcp, живет на 46.61.204.66:40039. При подключении клиента отправляет ему строку “200 welcome home”. Клиент должен отправить логин и пароль в строке вот такого вида - “login 11111 88888888”. Если логин/пароль активны, сервер отвечает “250 access granted”, если нет, то “550 access denied”. Есть текстовый файл, в котором около 1000 строк с логинами/паролями, задача в том, чтобы прогнать их все через сервер и записать активные в новый файл. Подскажите оптимальное решение. Вот живой логин - “login 18138 31422152”, пример файла с логинами во вложении

Прикреплённый файлы:
attachment login.txt (88 байт)

Офлайн

#2 Авг. 17, 2018 23:37:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Помогите написать Tcp клиент + работа с txt

Используй модуль socket
https://docs.python.org/3/library/socket.html#example



Офлайн

#3 Авг. 18, 2018 05:09:43

Tony_bonelli
Зарегистрирован: 2018-08-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать Tcp клиент + работа с txt


Спасибо, Кэп, обязательно использую))

Отредактировано Tony_bonelli (Авг. 18, 2018 05:13:15)

Офлайн

#4 Авг. 18, 2018 07:04:02

Tony_bonelli
Зарегистрирован: 2018-08-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать Tcp клиент + работа с txt

Вроде сам справился, думаю что для первого раза сойдёт, тем более что до этого только блок-схемы на информатике рисовал

 #-*-coding:utf8;-*-
#qpy:3
#qpy:console

import socket
loginfile = open(r'/storage/emulated/0/qpython/login.txt','r')
resultfile = open(r'/storage/emulated/0/qpython/result.txt','w')
line = loginfile.readline()
while line:
login = ('login ' + line[ :15] + '\n' )
line = loginfile.readline()
sock = socket.socket()
sock.connect(('176.32.188.106', 51435))
data = sock.recv(1024)
print (data)
sock.send (login.encode("utf-8"))
data = sock.recv(1024)
print (data)
if data == (b'250 Access granted\n'):
print ('ok')
resultfile.write(login)
sock.close()
loginfile.close()
resultfile.close()

Отредактировано Tony_bonelli (Авг. 18, 2018 07:07:06)

Офлайн

#5 Авг. 18, 2018 10:38:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Помогите написать Tcp клиент + работа с txt

Tony_bonelli
тем более что до этого только блок-схемы на информатике рисовал
Да не надо комплексовать. За день программировать не научишься, как ни старайся. Только тысячи неправильных кодов, написанных собственноручно, дают чутьё в конечном итоге. Даже не прочитанные книги, а именно написанные и опробованные во времени коды.

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

Это относится ко всем программам одинаково, будь программа хоть на десять строк, хоть на сто строк, хоть на тысячу строк или хоть на десять тысяч строк.

Вот представь, что у тебя программа не на двадцать строк, а на двести строк. Как ты поймёшь, правильная ли она? А если в ней надо будет заменить адрес сервера, порт и сообщение ответа сервера, как ты их все найдёшь, чтобы ни одно не пропустить, не забыть? А когда заменишь, как ты поймёшь, правильная ли она после этой замены и не нарушилось ли что-нибудь?

Все эти проблемы надо заранее убрать, поэтому первым делом надо абстрагировать данные (на сленге разработчиков это называется убрать магические числа)
  
HOST = '176.32.188.106'
PORT = 51435
SUCCESS_MESSAGE = b'250 Access granted\n'
 
...
sock.connect((HOST, PORT))
...
if data == SUCCESS_MESSAGE:
...
Магические числа называются магическими потому, что, глядя на них в середине кода, ты никогда точно не можешь сказать, что это за числа.

Строка
  
sock.connect(('176.32.188.106', 51435))
выглядит неинформативно. Толи это ip-адрес и порт, толи это ip-адрес и таймаут, толи это ip-адрес и размер пакета, - то есть это число осуществляет какую-то неизвестную магию. Без документации, без точных воспоминаний ты не можешь уверенно сказать, что именно делает строка, что настраивается в сокете.

Строка
  
sock.connect((HOST, PORT))
читается сразу однозначно.

Какие ещё преимущества даёт такое абстрагирование. Адрес сервера может поменяться, а таких строк в коде может быть десять, а не одна, как в твоём случае. Так, с абстрагированием, ты меняешь адрес сервера только в одном месте, в то время как без абстрагирования ты должен поменять десять строк в коде, а потом ещё проверять, что из-за этих изменений ничего не нарушилось и программа продолжает работать правильно. А что нужно сделать, чтобы понять, что программа на двести строк работает правильно?


tags: magic numbers



Отредактировано py.user.next (Авг. 18, 2018 10:48:15)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version