Найти - Пользователи
Полная версия: Помогите написать Tcp клиент + работа с txt
Начало » Центр помощи » Помогите написать Tcp клиент + работа с txt
1
Tony_bonelli
Добрый день!
Помогите решить задачу. Имеется сервер, работает по tcp, живет на 46.61.204.66:40039. При подключении клиента отправляет ему строку “200 welcome home”. Клиент должен отправить логин и пароль в строке вот такого вида - “login 11111 88888888”. Если логин/пароль активны, сервер отвечает “250 access granted”, если нет, то “550 access denied”. Есть текстовый файл, в котором около 1000 строк с логинами/паролями, задача в том, чтобы прогнать их все через сервер и записать активные в новый файл. Подскажите оптимальное решение. Вот живой логин - “login 18138 31422152”, пример файла с логинами во вложении
py.user.next
Используй модуль socket
https://docs.python.org/3/library/socket.html#example
Tony_bonelli

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

 #-*-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()
py.user.next
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB