В этом руководстве вы узнаете о сокетах в Python и о том, как использовать модуль сокетов для построения HTTP-серверов и клиентов в Python. Он также охватит Tornado, сетевую библиотеку Python, которая идеально подходит для длительных опросов, WebSockets и других приложений, для которых требуется длительное соединение с каждым пользователем.
Что такое сокеты?
Сокет — это связь между двумя приложениями, которые могут взаимодействовать друг с другом (локально на одном компьютере или удаленно между двумя компьютерами в разных местах).
По сути, сокеты действуют как канал связи между двумя объектами, то есть сервером и клиентом. Сервер выдаст информацию, запрашиваемую клиентом. Например, когда вы посетили эту страницу, браузер создал сокет и подключился к серверу.
Модуль розетки
Чтобы создать сокет, вы используете socket.socket() , а синтаксис такой простой:
|
1
2
|
import socket
s= socket.socket (socket_family, socket_type, protocol=0)
|
Вот описание аргументов:
- socket_family : представляет семейство адресов (и протоколов). Это может быть AF_UNIX или AF_INET.
- socket_type : представляет тип сокета и может быть SOCK_STREAM или SOCK_DGRAM.
- протокол : это необязательный аргумент, обычно по умолчанию он равен 0.
После получения объекта сокета вы можете создать сервер или клиент по своему усмотрению, используя методы, доступные в модуле сокета.
Создать простой клиент
Прежде чем мы начнем, давайте посмотрим на методы клиентского сокета, доступные в Python.
-
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -
s.connect():s.connect()соединение с сервером TCP.
Чтобы создать новый сокет, вы сначала импортируете метод сокета класса сокета.
|
1
|
import socket
|
Далее мы создадим сокет потока (TCP) следующим образом:
|
1
|
stream_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
|
Аргумент AF_INET указывает, что вы запрашиваете сокет интернет-протокола (IP), в частности, IPv4. Вторым аргументом является тип транспортного протокола SOCK_STREAM для сокетов TCP. Кроме того, вы также можете создать сокет IPv6, указав аргумент сокета AF_INET6 .
Укажите сервер.
|
1
|
server = «localhost»
|
Укажите порт, с которым мы хотим общаться.
|
1
|
port =80
|
Подключите сокет к порту, где сервер прослушивает.
|
1
2
|
server_address = ((host, port))
stream_socket.connect(server_address)
|
Важно отметить, что хост и порт должны быть кортежем.
Отправьте запрос данных на сервер:
|
1
2
|
message = ‘message’
stream_socket.sendall(message)
|
Получить ответ от сервера:
|
1
2
|
data = sock.recv(10)
print data
|
Чтобы закрыть подключенный сокет, вы используете метод close:
|
1
|
stream_socket.close()
|
Ниже приведен полный код клиента / сервера.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import socket
import sys
# Create a TCP/IP socket
stream_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define host
host = ‘localhost’
# define the communication port
port = 8080
# Connect the socket to the port where the server is listening
server_address = ((host, port))
print «connecting»
stream_socket.connect(server_address)
# Send data
message = ‘message’
stream_socket.sendall(message)
# response
data = stream_socket.recv(10)
print data
print ‘socket closed’
stream_socket.close()
|
Создайте простой сервер
Теперь давайте посмотрим на простой сервер Python. Ниже приведены методы сервера сокетов, доступные в Python.
-
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -
s.bind(): привязывает адрес (имя хоста, номер порта) к сокету. -
s.listen(): устанавливает и запускает прослушиватель TCP. -
s.accept(): принимает соединение с TCP-клиентом.
Мы будем следовать следующим шагам:
- Создать сокет.
- Свяжите сокет с портом.
- Начните принимать соединения на сокете.
Вот серверная программа.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define host
host = ‘localhost’
# define the communication port
port = 8080
# Bind the socket to the port
sock.bind((host, port))
# Listen for incoming connections
sock.listen(1)
# Wait for a connection
print ‘waiting for a connection’
connection, client = sock.accept()
print client, ‘connected’
# Receive the data in small chunks and retransmit it
data = connection.recv(16)
print ‘received «%s»‘ % data
if data:
connection.sendall(data)
else:
print ‘no data from’, client
# Close the connection
connection.close()
|
Сервер теперь готов к входящим соединениям.
Теперь запустите клиентские и серверные программы в отдельных окнах терминала, чтобы они могли общаться друг с другом.
Выход сервера
|
1
2
3
4
|
$ python server.py
waiting for a connection
(‘127.0.0.1’, 47050) connected
received «message»
|
Выход клиента
|
1
2
3
4
|
$ python client.py
connecting
message
socket closed
|
Каркас Торнадо
Среда Tornado — это одна из библиотек, доступных для сетевого программирования на Python. В этом разделе мы обсудим эту библиотеку и покажем, как использовать ее для создания WebSockets.
Tornado — это веб-фреймворк Python и библиотека асинхронных сетей. Tornado использует неблокирующий сетевой ввод-вывод и, следовательно, способен масштабировать до десятков тысяч открытых соединений. Эта особенность делает его идеальным для длительных опросов, WebSockets и других приложений, которым требуется долгоживущее соединение с каждым пользователем.
Давайте создадим простой Tornado WebSocket:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import tornado.ioloop
import tornado.web
class ApplicationHandler(tornado.web.RequestHandler):
def get(self):
self.message = message = «»»<html>
<head>
<title>Tornado Framework</title>
</head>
<body
<h2>Welcome to the Tornado framework</h2>
</body>
</html>»»»
self.write(message)
if __name__ == «__main__»:
application = tornado.web.Application([
(r»/», ApplicationHandler),
])
application.listen(5001)
tornado.ioloop.IOLoop.instance().start()
|
В приведенном выше коде:
- Мы определяем класс
ApplicationHandlerкоторый служит обработчиком для запроса и возвращает ответ, используя методwrite(). -
mainметодом является запись для программы. -
tornado.web.Applicationсоздает базу для веб-приложения и принимает набор обработчиков, т.е. ApplicationHandler. - Приложение прослушивает порт 5000, и клиент может общаться с этим приложением, используя тот же порт.
-
tornado.ioloop.IOLoop.instance().start()создает неблокирующий поток для приложения.
Если мы запустим приложение, мы получим результат, как показано на скриншоте ниже.

Вывод
К настоящему времени вы, должно быть, уже поняли основы программирования сокетов в Python и как вы можете создать простой сервер и клиент. Не стесняйтесь экспериментировать, создав собственный клиент для чата. Для получения дополнительной информации посетите официальные документы Python.
Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для изучения на рынке Envato , и не стесняйтесь задавать любые вопросы и предоставлять ценные отзывы, используя канал ниже.