Добавить в корзинуПозвонить
Найти в Дзене
Я'ж Программист

Пишем программу для обмена данных на Python Socket

Приветствую ! В этой статье мы напишем программу ( А точнее , программы) на python , которая позволит нам обмениваться данными в пределах одного устройства или вашей wi-fi сети . Для подобных целей существует модуль socket. Он уже установлен , так что загружать с pypi его не надо . Давайте начнём писать сервер для работы в локальной сети, а попутно я буду пояснять , что вообще происходит . import socket импортируем модуль . s = socket.socket() Создаём сокет . Отступление ! : сокет это программный интерфейс , который используется для обмена данными между программами . Дальше , мы должны передать методу .bind() кортеж с хостом и портом . Что это ??? Это Ещё одно отступление ! : Википедия говорит , что хост это "любое устройство предоставляющее сервисы формата клиент-сервер в режиме сервера по каким-либо интерфейсам и уникально определённое на этих интерфейсах" А мы как раз сервер пишем ) Так вот , что бы наш сервер был доступен для всех интерфейсов хост мы оставим пустым , а порт ...

Приветствую !

В этой статье мы напишем программу ( А точнее , программы) на 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 устройство) .

Раз уж вы дошли до сюда , почему бы вам не поставить класс этой статье и не подписаться ?