- Python program client server
- Создание клиент-сервер на Python для зародышей
- Saved searches
- Use saved searches to filter your results more quickly
- katmfoo/python-client-server
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
Python program client server
Многопоточность позволяет одновременно выполнять несколько различных действий в различных потоках. Применение многопточности в серверном приложении позволяет обрабатывать одновременно несколько клиентов. Рассмотрим, как создать многпоточное клиент-серверное приложение.
В Python многопоточность обеспечивается функциональностью модулей _thread и threading . В частности, для запуска нового потока мы можем использовать функцию start_new_thread() из модуля _thread , которая имеет следующее определение:
_thread.start_new_thread(function, args[, kwargs])
Эта функция запускает поток, который выполняет функцию из первого параметра function , передавая ей в качестве аргументов кортеж args . Опционально можно передать словарь дополнительных параметров через третий параметр kwargs
Например, определим в файле server.py следующий код сервера
import socket from _thread import * # функция для обработки каждого клиента def client_thread (con): data = con.recv(1024) # получаем данные от клиента message = data.decode() # преобразуем байты в строку print(f"Client sent: ") message = message[::-1] # инвертируем строку con.send(message.encode()) # отправляем сообщение клиенту con.close() # закрываем подключение server = socket.socket() # создаем объект сокета сервера hostname = socket.gethostname() # получаем имя хоста локальной машины port = 12345 # устанавливаем порт сервера server.bind((hostname, port)) # привязываем сокет сервера к хосту и порту server.listen(5) # начинаем прослушиваение входящих подключений print("Server running") while True: client, _ = server.accept() # принимаем клиента start_new_thread(client_thread, (client, )) # запускаем поток клиента
Здесь при подключении каждого нового подключения функция start_new_thread() запускает для его обработки функцию client_thread() и передает ей текущего клиента, который хранится в переменной client. В функции client_thread() для примера получаем от клиента строку, инвертируем ее и отправляем обратно клиенту.
Для тестирования сервера определим следующий код клиента:
import socket client = socket.socket() # создаем сокет клиента hostname = socket.gethostname() # получаем хост локальной машины port = 12345 # устанавливаем порт сервера client.connect((hostname, port)) # подключаемся к серверу message = input("Input a text: ") # вводим сообщение client.send(message.encode()) # отправляем сообщение серверу data = client.recv(1024) # получаем данные с сервера print("Server sent: ", data.decode()) client.close() # закрываем подключение
Клиент ожидает ввод с консоли строки, которая отправляется серверу. Ответ сервера выводится на консоль.
Запустим сервер, затем запустим клиент. Пример работы. Сервер:
c:\python>python server.py Server running Client sent: hello
c:\python>python client.py Input a text: hello Server sent: olleh c:\python>
Создание клиент-сервер на Python для зародышей
Приветик. В данной статье не будет никакой занудной теории по типу «А чТо ТаКоЕ СЕРВЕР. «. Мы будем вкратце описывать работу клиент-сервер, а также приведём примеры. Данная статья будет интересна тем, кто не до конца понимает как работает клиент-сервер, кто забивает в череп гвозди, чтобы повысить содержание железа и стать умнее, кто думает что клиент-сервер это что-то заоблачное для обычного начинающего кодера.
Итак, приступим к описанию принципов работы:
- Сервер, на IP адресе по порту ожидает подключения на указанный IP адрес с портом . IP машины и IP приёма должны быть одинаковы. Порты имеют значения в диапазоне 0-65535.
- Далее, клиент хочет зайти на ваш сервер. Изначально, наш сервер это небольшая консоль для доступа . например к дневнику Иванова Ивана и 5Б. Клиент вводит IP и порт , после чего по TCP или UPD происходит обмен данными.
- Сервер видит что кто-то хочет посмотреть нюдсы Иванова Ивана и просто отсылает их обратно клиенту.
— Вот так мы максимально кратко расписали клиент-сервер. Распишем немного побольше.
— ЭЙ СТОЙ! А чо ещё за TCP и UPD?
— Секундочку.
Что такое UPD и TCP?
Вкратце это технологии передачи данных между двумя устройствами. Они оба разные как лолихантер и милфхантер. Приведём парочку примеров:
— Эй, Санёк, я тут камни нашёл. Можно я в тебя его кину?
— Хорошо, Шанёк, кидай
— Разрешение кидать получено!
*Кинул камни настолько мягко и последовательно, что Санёк успел словить все*
Это был пример работы TCP. Он превосходит UPD в целостности данных, строго последовательным отправлением данных и большей надёжности, но в отличии от него меньшей скоростью.
— Эй, Санёк, лови!
*Кинул камни так сильно, что Санёк сразу дал дёру, успев сначала словить большую часть камней*
— *****, не поймал, в лицо попал
Это был пример работы UPD. В отличии от своего «прилежного» брата он более быстрый в закидывании камня. Но вместо строгой последовательности отправки данных, кидает всё что видит.
Теперь черпанём немного практики.
Для начала сделаем вечно получающий информацию сервер.
Для передачи информации через сокеты в Python используем socket
Теперь же нам надо сделать слушалку.
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) IP = socket.gethostbyname(socket.gethostname()) PORT = 12333 listener.bind((IP, PORT)) listener.listen(0) connection, address = listener.accept()
socket.socket() — создаём наш сокет. Тут мы просто создаём коробку определённого вида, цвета, размера (повторяю, это формально). Но без содержимого.
socket.setsockopt() — добавляем в нашу коробку пенопласт для информации. Настраиваем опции коробки: какой пенопласт, размеры и т.д.
IP = socket.gethostbyname(socket.gethostname()) — получаем наш IP. В функцию передаётся имя ПК, IP которого мы хотим получить, в нашем случае нас.
listener.bind((IP, PORT)) — устанавливаем данные для прослушивания данного порта. Берём почтовый ящик IP/PORT. Данные передаются кортежем, это не ошибка!
listener.listen() — разрешаем серверу принимать запросы.
listener.accept() — в случае найденного пользователя разрешаем ему подключиться
Теперь у нас есть почтовый ящик и заранее готовая коробка с посылкой. Теперь нам нужно проверять наш почтовый ящик. Наш почтовый ящик вмещает 1 КБ (1024 байт). Поэтому нам нужно каждый раз открывать ящик, забирать оттуда данные и продолжать до тех пор, пока ящик не опустеет.
connection.send("Привет, подкючайся!".encode('utf8')) connection.send("Привет!".encode('utf8')) while True: data_output = '' while True: data = connection.recv(1024).decode("utf8") data_output+=data if not data: break print(data_output)
connection.send() — отправить данные. Для вашей же живучести используйте .encode(«utf8»)
connection.recv(1024) — получить 1024 байт данных. Для вашей же живучести используйте .decode(«utf8»)
Вот так мы будем получать информацию о том, что нам отправили. Это как будто вы перевернули почтовый ящик вверх дном и высыпаете оттуда всё до конца.
— Но зачем в начале нам отправлять данные?
Таким образом мы показываем клиенту что готовы работать. Если бы мы этого не сделали, клиент бы стоял молчал.
Раз уж с сервером окончено перейдём к клиенту
import socket connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) IP = "айпи сервера" PORT = 12333 connection.connect((IP, PORT)) rd = connection.recv(1024) print(rd.decode('utf8')) connection.send("И тебе привет!".encode('utf8')) connection.close()
connection.connect() — начать подключение. Данные в функцию передаются кортежем!
connection.close() — закрыть соединение
Ну вот, теперь при запуске клиента по IP, от сервера мы получим «Привет», а сервер получит наше «И тебе привет!», а также продолжит ждать от нас ответ.
Прошу акцентировать внимание, что эти каналы легко прослушать, а по сему для передачи личных данных желательно пользоваться алгоритмами шифрования (например идеально подойдёт RSA).
Немного дополнительных вопросов:
- Можно ли при помощи сокетов сделать консоль? Как реализовать в нём команды?
- Конечно. Команды можно реализовать просто отправкой сообщения, а после получения обработкой через условия.
- Как сделать таймаут?
- Используйте на вашем подключении .settimeout(Время в секундах).
- Что если я укажу чужой адрес в прослушивании сервера?
- Вам просто выбьет ошибку.
- Можно ли по сокетам передавать фото, видео и т.д.?
- Да, конечно. Фото и видео это просто данные. Их можно прочесть, а соответственно и отправить.
Небольшая справочка по основным командам для создания сокетов:
socket.socket(socket.AF_INET, socket.SOCK_STREAM) — создать сокет
socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) — настроить сокет
socket.gethostbyname(socket.gethostname()) — получить наш готовый IP
listener.bind((IP, PORT)) — прослушивать данный IP по порту. Данные передаются кортежем!
listener.listen(0) — разрешаем серверу принимать запросы
listener.accept() — принимаем запрос на передачу данных
connection.send() — отправить данные
connection.recv(1024) — получить данные. Значение в скобочках, количество байт которые можно принять за один раз
connection.settimeout() — установить таймаут соединения
connection.connect() — установить подключение к серверу
connection.close() — закрыть соединение
Дополнительные источники, полезные ссылки:
И на этом мы закончим вступление клиент-сервер в Python для зародышей. Напомню что данная статья не создана для Truehard кодеров, она создана для тех кто не разбирается в сокетах и хочет понять как с ними работать.
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
A basic example of a TCP client/server network using Python’s socket and threading library.
katmfoo/python-client-server
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
A basic example of a TCP client/server network using Python’s socket and threading library. The server uses instances of a client object and individual threads to listen to incoming data from each client while listening for new connections.
- Download the server.py and client.py python files for Python 3.
- Run server.py . You will be prompted for a host and port for the server. If you are going to run the client on the same computer or local network as the server, use localhost as the host name. If you are going to run the client on a different network, use the computer’s local IP address (the IP address that resembles one of these). The port can be any 16 bit number (lower than 65535), but must be forwarded on your router if the client will be on a different network.
- Run client.py . If the server is running on the same computer, use localhost as the host. If the server is running on a different computer, but the same local network, use the local IP address of the computer that the server is running on. If the server is running on a different network, use the external IP address of the network that the server is running under (google what is my ip).
The client should successfully connect to the server. Each time the server accepts a new connection, it will print the connection information to the server console. When the server receives a message from any of the clients, it will print the message to the server console and bounce the messsage to all other clients (not the client that sent it).
On the client, just type in a message and hit enter to send it to the server. Due to the way the console works, if a message is sent to you while you are typing a message yourself, it will interrupt your typing.
About
A basic example of a TCP client/server network using Python’s socket and threading library.