Приветствую !
В этой статье мы напишем программу ( А точнее , программы) на python , которая позволит нам обмениваться данными в пределах одного устройства или вашей wi-fi сети .
Для подобных целей существует модуль socket. Он уже установлен , так что загружать с pypi его не надо .
Давайте начнём писать сервер для работы в локальной сети, а попутно я буду пояснять , что вообще происходит .
import socket
импортируем модуль .
s = socket.socket()
Создаём сокет . Отступление ! : сокет это программный интерфейс , который используется для обмена данными между программами .
Дальше , мы должны передать методу .bind() кортеж с хостом и портом . Что это ???
Это Ещё одно отступление ! : Википедия говорит , что хост это "любое устройство предоставляющее сервисы формата клиент-сервер в режиме сервера по каким-либо интерфейсам и уникально определённое на этих интерфейсах"
А мы как раз сервер пишем ) Так вот , что бы наш сервер был доступен для всех интерфейсов хост мы оставим пустым , а порт ... Всё тажа википедия говорит , что порт это "целое неотрицательное число, записываемое в заголовках протоколов транспортного уровня модели OSI (TCP, UDP, SCTP, DCCP). Используется для определения процесса-получателя пакета в пределах одного хоста." Очень интересно , я знаю , поэтому вот вам моё объяснение : Большой многоквартирный дом с тысячами квартир , а вы - человек из соседнего дома , пришли в поисках соли, вы можете постучаться в любую квартиру и вам могут открыть , чтобы поинтересоваться , что вам надо , а могут и не открыть .
в локальных сетях вы можете постучаться в квартиру от 0 до 65.535 и вам никто не откажет.
причем , для того , чтобы постучаться в квартиру от 0 до 1023(включительно) вам нужны будут права суперпользователя .
s.bind(('' , 19))
Я выбрал порт 19 , а значит , при запуске без прав суперпользователя , то выпадет ошибка permission denied.
s.listen(1)
В этой строке с помощью метода listen я указал , сколько человек могут ломиться в одну квартиру за солью )
Теперь нужно принять подключение ( Будем считать , что вас решили впустить в квартиру )
conn, addr = s.accept()
.accept() возвратит нам сокет и адрес клиента ( ну , то есть того , кто к нам подключился . ).
На данном моменте мы установили связь с клиентской частью и можем с ней работать , давайте ей что нибудь отправим .
conn.send(b"Hello client , i'am server !")
с помощью метода .send , кстати да , отправлять мы можем только
байты , именно для этого и нужна эта буква <b>
Отлично , всё работает , а теперь уберём эту строку и будем писать дальше :
while True:
data = conn.recv(2048)
Тут мы создали бесконечный цикл , а затем при помощи метода recv получаем , если они есть данные порциями по 2048 байт .
Но их может и не быть , поэтому добавим такую строчку :
if not data:
print('На сервер не поступает информации !')
break
Если данных нет , то выводим соответствующее сообщение и выходим из цикла.
Но если они есть , то делаем вот что :
file = open('file_name' , 'ab')
file.write(data)
Создаём файл с интересным названием в режиме , как я его называю < Бинарного добавления >
и записываем туда данные , кстати да , по поводу расширения , я его не добавляю так как в юниксо-подобных операционках файлы могут не иметь расширения и нормально работать , вроде под виндой это так не работает .
и финальным аккордом будет закрытие соединения , выходим из цикла
conn.close()
Вот полный код Сервера :
import socket
s = socket.socket()
s.bind(('' , 19))
s.listen(1)
conn, addr = s.accept()
while True:
data = conn.recv(2048)
if not data:
print('Файл получен')
print('На сервер не поступает информации !')
break
file = open('file_name' , 'ab')
file.write(data)
conn.close()
Вообще , в клиенте почти ничего нового нет , поэтому вот :
import socket
sock = socket.socket()
sock.connect(('localhost',19))
while True:
file_name = input('Введите назваие файла : ')
file = open(file_name , 'rb')
a = file.read()
sock.send(a)
file.close()
break
sock.close()
Знакомьтесь , это клиент
sock.connect(('localhost',19))
В этой строчке мы присоединяемся к серверу , localhost указывает на то , что хост локальный , то есть на том же пк , что и клиент , если заменить localhost на ip адрес компьютера с сервером - то можно будет отправлять информацию , например с телефона (клиента) на сервер (пк) ( Или с другого пк в той же сети , что и сервер )
Видео с работой сервера на одном пк
А это на телефоне и пк :
На этом я прощаюсь , в следующей статье мы устроим dos атаку на Bluetooth устройство) .