Статьи

Введение в сетевое программирование на Python

В этом руководстве вы узнаете о сокетах в 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() создает неблокирующий поток для приложения.

Если мы запустим приложение, мы получим результат, как показано на скриншоте ниже.

The results of running our application

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

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